从头开始创建Hashtable?

时间:2011-10-27 16:56:41

标签: java hashtable

我正在编写一个程序,它会记录文档中的单词及其使用频率和行号。当我被告知你必须从头创建一个哈希表时,我以为我已经完成了它。我不知道从哪里开始。关于在哪里以及如何开始的任何建议将不胜感激。

4 个答案:

答案 0 :(得分:11)

哈希表是一种重要的基础数据结构。您可以在Wikipedia's Hash table article了解更多相关信息。幸运的是,它们很容易实现。

哈希表基本上是一个数据结构,它接受一个键并返回或存储该键的值。

它们的核心通常是使用数组实现的,我们将其称为arr,以便将键值对存储在arr[key.hashCode()%arr.length]。请注意,由于您的数组不是无限长度,并且hashCode不能保证生成唯一值,因此最终会得到映射到数组相同索引的键。这称为碰撞

解决这些冲突的一种方法是为arr的每个成员存储链接列表。然后arr的定义看起来像这样

LinkedList<Object> arr[];

映射到arr[key.hashCode()%arr.length]的所有对象都将添加到该位置的列表中。如果要从哈希表中检索对象,请跳转到arr[key.hashCode()%arr.length]处的链接列表并遍历链表的每个成员,直到找到键为.equals的键值对。

一个好的哈希表实现可能会执行一些事情,例如一旦它变得太满就调整arr

答案 1 :(得分:2)

要创建哈希表,您需要记住要构建的结构。哈希表有2个元素,一个键集和一个值集。考虑一下如何表示这些以及如何确保键始终映射到适当的值。

接下来,考虑一下你的哈希函数。请记住,没有“正确”的哈希函数。你只需要想出一个适合你的方法。

一旦完成这两件事,剩下的就很简单了。编写处理这两个集合的方法基本上只是巧妙地使用哈希函数。

祝你好运!

额外提示:请记住,哈希表的值集不一定与键集的大小相同。记住桶的概念。这非常重要。

答案 2 :(得分:1)

从研究HashMap Java类开始。请注意,它是AbstractMap的扩展,并且AbstractMap提供了许多您想要的基本功能。然而,并非所有这些都是。最重要的方法put()始终抛出UnsupportedOperationException。那是设计上的。要使其成为MyHashMap,您需要覆盖此方法。在put()里面你将完成Jack's great answer中提到的所有你的东西。

public class MyHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V> {

  // your implementation goes in here, including the override of put()

}

通过这种方式,您可以更轻松地测试您的实施。运行一系列测试,在其中提供HashMap作为参数。然后使用MyHashMap的对象运行相同的代码。由于两者都是Map的实现,因此您可以在不更改任何代码的情况下将其中一个替换为另一个,并且您将对测试告诉您的内容充满信心。

答案 3 :(得分:1)

只需为您的表使用数组。你需要一个哈希函数和一个加载因子。加载因子将决定何时调整表的大小以保持其效率。字符串的简单哈希函数是将每个字符的ascii值乘以2 ^(字符索引)并将该值与表长度相加。 e.g。

static int hash(String s) {
    int len = 30;
    int sum = 0;
    for(int i = 0; i < s.length(); i++) {
        sum += ((int)s.charAt(i)) * (1<<i);
    }
    return sum%len;
}

您也可以使用String.hashCode。要解决冲突,最简单的方法是线性探测,但群集会很快发生。您可以实现双重散列以获得更好的性能。