我实现了一类具有下面的头有没有办法处理HashTable中的冲突,使得一个键与一个值没有关联?
public class HashTable<K,V>
要处理,我使用分离链与链表的碰撞。然而,有没有工具的方法的方式来获得一个给定值的关键,如
public V get(K key)
不知道V具有的是得到它的键(因为它是通用)的方法?我看不到的是如何知道链表中的哪个值返回,如果一个键哈希到数组中的同一个索引,即在碰撞的情况下返回什么。
我实现了一类具有下面的头有没有办法处理HashTable中的冲突,使得一个键与一个值没有关联?
public class HashTable<K,V>
要处理,我使用分离链与链表的碰撞。然而,有没有工具的方法的方式来获得一个给定值的关键,如
public V get(K key)
不知道V具有的是得到它的键(因为它是通用)的方法?我看不到的是如何知道链表中的哪个值返回,如果一个键哈希到数组中的同一个索引,即在碰撞的情况下返回什么。
由于您正在为插入传递键和值对,因此可以将两者都存储在表中。
使用链表的数组实现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)方法,散列密钥和通过所有的(键,值)对在散列值位置对象迭代然后为返回值键。
下面的代码片段展示了如何做到这一点,
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方法。
使用散列码方法查找适当的列表,然后使用equals方法查找完全匹配。
如果例如K1和K2具有相同的哈希码,则它们将在相同的列表上结束。当你以后用K2来获得时,你将不得不遍历列表寻找key.equals(K2)的条目。
但是,你怎么知道的值对象中有一个关键的变量?这是通用的,对吧? –
你的地图有一个关键和价值。它们是独立的对象。您使用密钥的hashcode和equals方法来查找感兴趣的值。 – JoshOfAllTrades