【问题标题】:Is there a way to handle collisions in a HashTable such that a key is not associated with a value?有没有办法处理 HashTable 中的冲突,使得键不与值关联?
【发布时间】:2014-04-25 18:42:55
【问题描述】:

我正在实现一个具有以下标头的类

public class HashTable<K,V>

为了处理冲突,我使用了带有链表的单独链接。但是,有没有办法实现一种方法来获取给定键的值,例如

public V get(K key)

不知道 V 有一个获取其密钥的方法(因为它是通用的)?我看不到的是,如果一个键散列到数组中的同一索引,如何知道要返回链表中的哪个值,即在发生冲突时返回什么。

【问题讨论】:

    标签: hash hashtable


    【解决方案1】:

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

    使用链表数组实现哈希表。在 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;
    }
    

    【讨论】:

      【解决方案2】:

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

      使用 hashcode 方法找到合适的列表,然后使用 equals 方法找到完全匹配。

      例如,如果 K1 和 K2 具有相同的哈希码,那么它们最终将出现在同一个列表中。当您稍后使用 K2 时,您将不得不遍历列表以查找其 key.equals(K2) 的条目。

      【讨论】:

      • 但是你怎么知道一个值对象里面有一个键变量呢?毕竟是通用的,对吧?
      • 您的地图既有键又有值。它们是单独的对象。您使用键的 hashcode 和 equals 方法来查找感兴趣的值。
      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多