【问题标题】:How to make a key have multiple values in a Hashtable? [duplicate]如何使键在哈希表中具有多个值? [复制]
【发布时间】:2017-03-13 01:22:55
【问题描述】:

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

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

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

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?

【问题讨论】:

  • @NickBell 那不一样。
  • 你希望ht.get(1)返回什么?
  • 40 和 60。

标签: java hashtable equals hashcode hash-collision


【解决方案1】:

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

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

您的 put 操作如下所示:

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);
}

[更新1] 如果你愿意,你可以像这样扩展 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);
    }
}

【讨论】:

  • 这意味着我正在覆盖哈希表的 put 方法,对吗? @rsutormin
  • 从 Java 8 开始,您可以在一行中执行此操作:hashTable.computeIfAbsent(key, k -&gt; new ArrayList&lt;Integer&gt;()).add(value); 事实上,the documentation 有一个正是这种用例的示例。
  • @MayurTolani:在我的主要答案 [UPDATE1] 中回答了你。
  • @VGR,这很方便!
【解决方案2】:

您正在使用相同的键 (1),这不是您想要的,除非您想向同一个键添加更多值,在这种情况下,有数组列表的哈希表 HashMap&lt;Integer,List&lt;Integer&gt;&gt; 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

【讨论】:

    【解决方案3】:

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

    或者,您可以使用Map&lt;Integer, List&lt;Integer&gt;&gt;

    【讨论】:

      【解决方案4】:

      您要查找的数据结构称为Multi Map。根据定义,它具有与映射不同的接口,因为它允许多个值与同一个键关联。

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

      【讨论】:

        【解决方案5】:

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

        在哈希表的一个单元格中不能存储多个值

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

        有一些算法方案可以尝试解决冲突,一种是线性探测 - 它为要存储的密钥找到下一个最合适的空闲空间

        【讨论】:

          猜你喜欢
          • 2017-01-20
          • 2015-07-26
          • 2011-06-01
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 2016-09-28
          相关资源
          最近更新 更多