2

假设我有 hashmap 存储,它包含例如-(11,name1) (11,name2),我调用 HashMap.get(11),它只显示 name2,这意味着它覆盖了 11 的第一个输入。我如何存储ID 11 的 name1 和 name2 都使用 hashmap?我知道我可以同时使用 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

4 回答 4

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也是类似的解决方案。

于 2013-02-13T15:09:22.123 回答
3

您可能可以使用Apache Commons Collections 中的MultiMap

于 2013-02-13T15:10:05.040 回答
1

您将必须有一个HashMap其中每个键的值是另一个集合(列表或集合)或将字符串值连接在一起(例如逗号分隔)。

或者,您可能能够找到一个支持每个键多个值的数据集合。

于 2013-02-13T15:10:03.437 回答
1

要为单个键存储多个值,请使用HashMap包含列表作为值的 a。HashMap的实现覆盖现有键的值。

HashMap<Integer,List<String>>

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

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

因此,您可以像这样访问该列表:

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

最后一点,您可以使用任何您认为合适的集合,如果性能对您很重要并且您不会为同一索引存储重复值,甚至可以使用 HashSet。

于 2013-02-13T15:17:04.950 回答