2014-04-25 18 views
0

我实现了一类具有下面的头有没有办法处理HashTable中的冲突,使得一个键与一个值没有关联?

public class HashTable<K,V> 

要处理,我使用分离链与链表的碰撞。然而,有没有工具的方法的方式来获得一个给定值的关键,如

public V get(K key) 

不知道V具有的是得到它的键(因为它是通用)的方法?我看不到的是如何知道链表中的哪个值返回,如果一个键哈希到数组中的同一个索引,即在碰撞的情况下返回什么。

回答

1

由于您正在为插入传递键和值对,因此可以将两者都存储在表中。

使用链表的数组实现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; 
} 
-1

您需要同时使用hashcode和equals方法。

使用散列码方法查找适当的列表,然后使用equals方法查找完全匹配。

如果例如K1和K2具有相同的哈希码,则它们将在相同的列表上结束。当你以后用K2来获得时,你将不得不遍历列表寻找key.equals(K2)的条目。

+0

但是,你怎么知道的值对象中有一个关键的变量?这是通用的,对吧? –

+0

你的地图有一个关键和价值。它们是独立的对象。您使用密钥的hashcode和equals方法来查找感兴趣的值。 – JoshOfAllTrades

相关问题