Java HashMap重复元素

9
我想在哈希映射中添加重复的元素。
因此:
put("name1", 1);
put("name1", 3);
put("name1", 3);
put("name2", 1);
put("name2", 3);

我该如何做到这一点?


做这件事有什么好处?你想要实现什么目标,如果你提供更多细节,也许有更好的方法可以做到。 - ant
6个回答

13

使用 Map<String, List<Integer>>,即将字符串映射为整数列表。

因此,在这种情况下,name1 将映射到一个包含 [1,3,3] 的列表。

显然,您需要编写自己的 put 方法,在其中将整数添加到列表中。例如:

put(String s, int i){
    List<Integer> list = map.get(s);
    if(list == null){
        list = new ArrayList<Integer>();
        map.put(s, list);
    }
    list.add(i);
}

13

来自GuavaListMultimap接口可能符合您的要求。它允许重复的键和重复的键/值对。

ListMultimap<String, Integer> m =
    ArrayListMultimap.create();
m.put("name1", 1);
m.put("name1", 3);
m.put("name1", 3);
m.put("name2", 1);
m.put("name2", 3);
System.out.println(m.get("name1")); // => [1, 3, 3]
System.out.println(m.get("name2")); // => [1, 3]

如果不需要保留重复的键/值对,那么一个 HashMultimap 可能就足够了(而且更有效率)。如果你将相同的条目插入到 HashMultimap 中,会得到以下结果:

System.out.println(m.get("name1")); // => [1, 3]
System.out.println(m.get("name2")); // => [1, 3]

5

您的想法违反了Map接口的合同:

一个将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值。

当您提出以下问题时,这对于地图来说是令人困惑的:

map.get("name1")

它不知道要获取哪个值。

我会使用dogbane的解决方案,将每个键映射到一个整数列表。在您的示例中,可能存在重复值。如果您不想有重复值(即对于“name1”,结果列表中只有一个3),则可以将其作为字符串映射到整数集合的Map。


3

您应该使用Google Collection的Multimap数据结构。

这是类似于Map的集合,但可以将多个值与单个键关联起来。如果您使用相同的键但不同的值两次调用put(K,V),则Multimap包含从键到两个值的映射。

这正是您要实现的目标。在我看来,没有必要通过编写自定义Map操作来重新发明轮子。此外,您可能会发现tutorial关于MultiMap的教程很有用。


更具体地说,我认为它需要是一个ListMultimapSetMultimap不允许重复的键/值对,但在示例输入中有一个。那篇文章有点过时了。Google Collections已经合并到Guava中。 - finnw
可以使用 HashMultimap。 - CoolBeans
HashMultimap 允许重复的键,但不允许重复的键/值对。如果你将示例条目插入 HashMultimap 中,最终只有一个 name1=3 条目。 - finnw
好的。好的,我回去仔细看了一下OP的数据...他/她确实有一个重复的键/值对...起初我以为他/她只是需要重复的键。感谢您指出这一点 :-) - CoolBeans

0

org.apache.commons.collections.map.MultiValueMap是一个更合适的选择。它可以将一个键放入多个值中。

public Object put(Object key, Object value) {
    boolean result = false;
    Collection coll = getCollection(key);
    if (coll == null) {
        coll = createCollection(1);
        result = coll.add(value);
        if (coll.size() > 0) {
            // only add if non-zero size to maintain class state
            getMap().put(key, coll);
            result = false;
        }
    } else {
        result = coll.add(value);
    }
    return (result ? value : null);
}

0
你不能这样做,但是你可以创建自己的map实现,允许重复。

2
如果它允许重复,那么它就不是一个“Map”。 - finnw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接