我正在使用以下标题实现一个类
public class HashTable<K,V>
要处理冲突,我使用链接列表进行单独链接。但是,有没有办法实现一个方法来获取给定一个键的值,如
public V get(K key)
不知道V有一个获取密钥的方法(因为它是通用的)?我看不到的是如果一个键哈希到数组中的同一个索引,即在碰撞的情况下返回什么,如何知道链表中哪个值返回。
答案 0 :(得分:1)
由于您传递了插入的键和值对,因此可以将它们存储在表中。
使用Linked list数组实现HashTable。在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)方法中,散列密钥并遍历hashvalue位置中的所有(键,值)对对象,然后返回密钥的值。
以下代码段显示了如何执行此操作,
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;
}
答案 1 :(得分:-1)
您需要同时使用hashcode和equals方法。
使用hashcode方法查找正确的列表,然后使用equals方法查找完全匹配。
例如,如果K1和K2具有相同的哈希码,那么它们将最终位于同一列表中。当你以后使用K2时,你将不得不遍历列表,寻找key.equals(K2)的条目。