2009-05-02 63 views
1

我正在爲Java中的哈希表編寫一個類...你能否確保我現在正確地做到了這一點。HashTable Java ...你能檢查我的代碼

我需要存儲在它StudentRecord對象....我計算基於學生的ID的哈希值的類型爲long ...

package proj3; 

import java.util.LinkedList; 

public class HashTable { 

    LinkedList<StudentRecord> [] buckets; 
    int size; 

    public HashTable(){ 
      size = 10; 
      initialize();  
    } 

    public HashTable(int initialSize){ 
     size = initialSize; 
     initialize(); 
    } 

    private void initialize(){ 
     for(int i=0; i<size; i++){ 
      buckets[i] = new LinkedList<StudentRecord>(); 
     } 
    } 
    /** for testing only 
    private int calculateHashString(String s){ 
     int hash = 0; 
     for(int i=0; i<s.length(); i++){ 
      hash += s.charAt(i); 
     } 
     return hash % size; 
    } 
    **/ 

    private int calculateHash(long l){ 
     return (int) (l % size); 
    } 


    public boolean contains(StudentRecord sr){ 
     int hash = calculateHash(sr.studentID); 
     LinkedList<StudentRecord> l = buckets[hash]; 
     if(l.contains(sr)){ 
      return true; 
     } 
     return false; 
    } 

    public void put(StudentRecord sr){ 
     int hash = calculateHash(sr.studentID); 
     LinkedList<StudentRecord> l = buckets[hash]; 
     if(!l.contains(sr)){ 
      buckets[hash].add(sr); 
     } 
    } 

} 
+0

這功課嗎?如果是這樣,你應該這樣標記這個問題。 – Seb 2009-05-02 03:24:02

回答

2

看起來不錯。

8

我想你可能想編寫單元測試來驗證它的實際功能,而不管你的f(r)iendly SO專家的理智是否檢查它。

超越簡單測試用例的一件好事是比較您的實現與標準JDK HashMap的功能;生成隨機密鑰和/或值,插入,刪除和檢查兩種實現之間的狀態是相同的(它們應該達到的程度)。

3

buckets似乎永遠不會被初始化。當你嘗試這樣做時,編譯器應該給你一個警告。堅持集合優先於數組(除了基元)。

通過調用其他構造函數(this(10),可以更簡單地實現無參數構造函數。

由於多個原因,表達式(int) (l % size)即使出現正數size也可能返回負數。

代碼

public boolean contains(StudentRecord sr){ 
    ... 
    if(l.contains(sr)){ 
      return true; 
    } 
    return false; 
} 

可以看得更清楚寫成

public boolean contains(Student student) { 
    ... 
    return list.contains(student); 
} 
0

湯姆是正確的,你需要初始化桶新的LinkedList [大小。

我認爲你想最終確定尺寸,並從一個更大的值開始,比如說256.如果在項目添加到表格後調整尺寸,則需要將它們全部移到它們的新桶中(從改變了哈希算法)。

另一方面,10是很好的測試 - 在相同的桶大量的碰撞!

爲了節省內存,您不必在開始時初始化所有這些新的LinkedList(),您可以將它們保留爲空。您可以等待創建每個列表對象,直到新項目實際上擊中空桶。當然,這將意味着需要額外的代碼,以檢查您嘗試讀取的存儲桶是否爲空,如果是,則假定它是空列表。

0

你必須重寫equals和hashCode方法。