【发布时间】:2014-04-25 18:42:55
【问题描述】:
我正在实现一个具有以下标头的类
public class HashTable<K,V>
为了处理冲突,我使用了带有链表的单独链接。但是,有没有办法实现一种方法来获取给定键的值,例如
public V get(K key)
不知道 V 有一个获取其密钥的方法(因为它是通用的)?我看不到的是,如果一个键散列到数组中的同一索引,如何知道要返回链表中的哪个值,即在发生冲突时返回什么。
【问题讨论】:
我正在实现一个具有以下标头的类
public class HashTable<K,V>
为了处理冲突,我使用了带有链表的单独链接。但是,有没有办法实现一种方法来获取给定键的值,例如
public V get(K key)
不知道 V 有一个获取其密钥的方法(因为它是通用的)?我看不到的是,如果一个键散列到数组中的同一索引,如何知道要返回链表中的哪个值,即在发生冲突时返回什么。
【问题讨论】:
由于您正在传递用于插入的键和值对,因此您可以将两者都存储在表中。
使用链表数组实现哈希表。在 LinkedList 的每个节点中,将 (key, value) 对存储为单个对象。您将散列键并在散列值位置存储(键,值)对对象。对象可以像下面这样,
public static class WrapObject
{
K key;
V value;
public WrapObject(K key, V value) {
this.key = key;
this.value = value;
}
}
然后在 get(K key) 方法中,对键进行哈希处理并遍历哈希值位置中的所有 (key, value) 对对象,然后返回键的值。
下面的代码sn-p展示了怎么做,
LinkedList<WrapObject>[] arrList = new LinkedList[10001];
public V get(K key)
{
int hashValue=hash(key);
if(arrList[hashValue]==null)
{
return null;
}
LinkedList<WrapObject> lList = arrList[ hashValue ];
for(WrapObject obj : lList)
{
if((obj.key).compareTo(key)==0)
{
return obj.value;
}
}
return null;
}
【讨论】:
你需要同时使用 hashcode 和 equals 方法。
使用 hashcode 方法找到合适的列表,然后使用 equals 方法找到完全匹配。
例如,如果 K1 和 K2 具有相同的哈希码,那么它们最终将出现在同一个列表中。当您稍后使用 K2 时,您将不得不遍历列表以查找其 key.equals(K2) 的条目。
【讨论】: