2016-10-30 38 views
0

我有100个条目,我必须将这些散列成一个有限大小的散列表。如何使密钥在Hashtable中具有多个值?

我知道如何使用第一个条目,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都成为?

+0

@NickBell那一个是不同的。 –

+0

你想要'ht.get(1)'返回什么? – njzk2

+0

40和60. –

回答

0

您正在使用相同的密钥(1),这不是您想要的,除非您想向同一个密钥添加更多值,在这种情况下,请使用散列表HashMap<Integer,List<Integer>> integerArrayMap

在Hashtable中,键必须是唯一的,因为您没有使用唯一键,相同的值将被替换。所以尽量把值与不同的键。

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

我建议你参考Hashtable的API在这里: https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html

2

你可以列出作为价值型喜欢下最合适的自由空间:

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

[UPDATE1] 如果你愿意,你可以让你的一个EXTENS 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); 
    } 
} 
+0

这意味着我重写散列表的put方法权利? @rsutormin –

+1

从Java 8开始,您可以在一行内完成:'hashTable.computeIfAbsent(key,k - > new ArrayList ()).add(value);'事实上,[文档](https: //docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-)就是这个用例的一个例子。 – VGR

+0

@MayurTolani:在我的主要答案中[UPDATE1]回答了你。 – rsutormin

1

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

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

相关问题