2009-05-02 32 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方法。