有没有办法处理HashTable中的冲突,使得键不与值相关联?

时间:2014-04-25 18:42:56

标签: hash hashtable

我正在使用以下标题实现一个类

public class HashTable<K,V>

要处理冲突,我使用链接列表进行单独链接。但是,有没有办法实现一个方法来获取给定一个键的值,如

public V get(K key)

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

2 个答案:

答案 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)的条目。