如何使密钥在Hashtable中具有多个值?

时间:2016-10-30 21:57:52

标签: java hashtable equals hashcode hash-collision

我有100个条目,我必须将它们哈希到一个有限大小的哈希表中。

我知道如何处理第一个条目,ht.put(k,v)可以解决问题。

但是只要我想为它添加另一个值,旧的就会被覆盖。我不想这样做,我想将它附加到链表或arraylist中。

Hashtable<Integer,Integer> ht = new Hashtable<Integer,Integer>(211);

ht.put(1, 40);
ht.put (1, 60);

System.out.println(ht.get(1));
// output is 60

如何使它成为40和60?

5 个答案:

答案 0 :(得分:2)

您可以将List作为值类型,如:

Hashtable<Integer,List<Integer>> ht = new Hashtable<Integer,List<Integer>>(211);

你的看跌操作如下:

public static void put(Hashtable<Integer,List<Integer>> ht, int key, int value) {
    List<Integer> list = ht.get(key);
    if (list == null) {
        list = new ArrayList<Integer>();
        ht.put(key, list);
    }
    list.add(value);
}

[UPDATE1] 如果您愿意,可以将您的Hashtable扩展为:

public class MyHashtable extends Hashtable<Integer,List<Integer>> {
    public MyHashtable(...) {  // add params if needed
        super(...);
    }

    // with additional method:
    public static void putOne(int key, int value) {
        List<Integer> list = this.get(key);
        if (list == null) {
            list = new ArrayList<Integer>();
            this.put(key, list);
        }
        list.add(value);
    }
}

答案 1 :(得分:1)

您需要线性探测http://www.sanfoundry.com/java-program-implement-hash-tables-linear-probing/

无法在哈希表的单元格中存储多个值

当尝试将新密钥映射到已占用的单元时,这称为冲突。

有一些算法可以尝试解决碰撞问题,其中一种是线性探测 - 找到下一个最适合存储密钥的可用空间

答案 2 :(得分:1)

您要查找的数据结构称为多地图。根据定义,它具有与地图不同的界面,因为它允许与同一个键相关联的多个值。

此数据结构还没有标准库实现。但是你可以在一些开源库中找到好的:

答案 3 :(得分:0)

你正在使用相同的密钥(1),这不是你想要的,除非你想为同一个密钥添加更多的值,在这种情况下有数组列表的哈希表HashMap<Integer,List<Integer>> integerArrayMap

在Hashtable中,Key必须是唯一的,因为您没有使用唯一键,相同的值将被替换。所以尝试用不同的键放置值。

ht.put(1, 40);
ht.put (2, 60);

我建议你在这里引用Hashtable api: https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html

答案 4 :(得分:0)

如果您被允许使用,Multimap(https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Multimap.html)会有所帮助。

或者,您可以使用Map<Integer, List<Integer>>