我有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?
答案 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>>
。