2013-05-06 34 views
0

測試testGetBucket()只有在鍵大於5個字符時才起作用。示例如果任何小狗名稱長度超過5個字符,則測試將爲getBucket方法返回ArrayIndexOutOfBounds異常。奇怪的哈希表ArrayIndexOutOfBounds異常

@Test 
    public void testGetBucket() { 
     List<Puppy> puppies = getPuppies(); 
     MyHashTable<String, Puppy> instance = new MyHashTable<>(DefaultCapacity, DefaultLoadFactor); 

     for (int i = 0; i < 10; i++) { 
      Puppy puppy = puppies.get(i); 
      instance.put(puppy.name, puppy); 
      System.out.print(i); 
     } 

     List<KeyValuePair<String, Puppy>> actual = instance.getBucket(8); 
     assertEquals("Size of bucket is three", 3, actual.size()); 
     for (int i = 0; i < actual.size(); i++) { 
      KeyValuePair<String, Puppy> p = actual.get(i); 
      if (p.key.equals("Bob")) { 
       assertEquals("Bucket contains " + p.value.name, puppies.get(1), p.value); 
      } else if (p.key.equals("Francois")) { 
       assertEquals("Bucket contains " + p.value.name, puppies.get(5), p.value); 
      } else if (p.key.equals("Inigo")) { 
       assertEquals("Bucket contains " + p.value.name, puppies.get(8), p.value); 
      } 
     } 

     actual = instance.getBucket(3); 
     assertEquals("Size of bucket is Zero", 0, actual.size()); 

     actual = instance.getBucket(0); 
     assertEquals("Size of bucket is 1", 1, actual.size()); 
     KeyValuePair<String, Puppy> p = actual.get(0); 
     assertEquals("Bucket contains " + p.value.name, puppies.get(2), p.value); 
    } 



public void put(K key, V value) 
    { 
     remove(key); 
     KeyValuePair<K,V> element = new KeyValuePair<K,V>(key, value); 
     getBucket(getBucketIndex(key.hashCode())).add(element); 
    } 


public int getBucketIndex(int hashCode) 
    { 
     return hashCode % getNumberOfCollisionBuckets(); 
    } 

public List<KeyValuePair<K,V>> getBucket(int bucketIndex) 
    { 

     return collisionBuckets[bucketIndex]; 
    } 
+0

我們沒有看到'getNumberOfCollisionBuckets()',也沒有看到'collisionBuckets'是如何初始化的。 – leonbloy 2013-05-06 00:16:04

回答

0

我要去的肢體,去這裏說的問題是這部分

return hashCode % getNumberOfCollisionBuckets(); 

如果你的命名是任何指導的問題是哈希碼。我不知道你爲什麼決定走這麼脆弱的實施。

當你的錯誤發生時,hashCode必須是一個值,在調製之後,它的結果會高於數組的索引值。

那麼解決這個問題的方法?停止依靠hashCode來執行類似獲取數組索引......這不是它的目的。