假设我有hashmap存储,它包含例如 - (11,name1)(11,name2),我调用HashMap.get(11),它只显示name2,这意味着它会覆盖11的第一个输入。我可以使用hashmap存储ID为11的name1和name2吗?我知道我可以同时使用HashMap和HashSet,但我不想为HashMap创建每个HashSet。我只想使用hashSet。我该怎么做?我希望你能帮助我。谢谢。
public void insert(int ID, String key){
int hashKey = Hash(key);
System.out.println("Hash Key" + hashKey);
int node = Find(ID,hashKey);
storeR.put(node, key);
}
答案 0 :(得分:6)
您可以使用:
HashMap<Integer, List<String>>
在HashMap
中,您必须为每个键添加一个值。所以当然,如果你把相同的键放两次,那么值就会被覆盖。
解决方案是为每个键保存一组值。
代码中的代码:
storeR.put(node, key);
你应该写:
List<String> nodeValues = storeR.get(node);
if (nodeValues == null) {
nodeValues = new ArrayList<String>();
storeR.put(node, nodeValues );
}
nodeValues.add(key);
您还应将storeR
类型更改为HashMap<Integer, List<String>>
MultiMap
也是一个类似的解决方案。
答案 1 :(得分:3)
您可以使用Apache Commons Collections中的MultiMap。
答案 2 :(得分:1)
您必须拥有HashMap
,其中每个键的值是另一个集合(列表或集)或将字符串值连接在一起(例如以逗号分隔)。
或者,您可以找到支持每个键多个值的数据集合。
答案 3 :(得分:1)
要为单个密钥存储多个值,请使用包含列表作为值的HashMap
。 HashMap
的实现会覆盖现有密钥的值。
HashMap<Integer,List<String>>
此外,您可以使用来自Apache Commons的MultiMap
,或者,如果您只是使用Integer
,我建议您直接使用array
:
List<String>[] yourList = new List<String>[initCapacity];
所以你可以像这样访问那个列表:
yourList[0].add("A New Value");
作为最后一点,你可以使用任何你认为合适的集合,即使是HashSet,如果性能对你很重要,你也不会为同一个索引存储重复的值。