HashMap会覆盖nextvalue Java

时间:2013-02-13 15:08:01

标签: java hashmap

假设我有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);
    }

4 个答案:

答案 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)

要为单个密钥存储多个值,请使用包含列表作为值的HashMapHashMap的实现会覆盖现有密钥的值。

HashMap<Integer,List<String>>

此外,您可以使用来自Apache Commons的MultiMap,或者,如果您只是使用Integer,我建议您直接使用array

List<String>[] yourList = new List<String>[initCapacity];

所以你可以像这样访问那个列表:

yourList[0].add("A New Value");

作为最后一点,你可以使用任何你认为合适的集合,即使是HashSet,如果性能对你很重要,你也不会为同一个索引存储重复的值。