Java HashMap重复元素

我想在hashmap上添加重复元素

所以:

put("name1", 1); put("name1", 3); put("name1", 3); put("name2", 1); put("name2", 3); 

我怎么能这样做?

使用Map>即将字符串映射到整数列表。

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

显然你必须编写自己的put方法,在其中将int添加到列表中。 例:

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

Guava的ListMultimap接口可能符合您的要求。 它允许重复键重复键/值对。

 ListMultimap 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] 

您的想法违反了Map界面的合同:

An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.

当你提问时,可以理解的是,地图会让人感到困惑:

 map.get("name1") 

它不知道要获得哪个值。

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

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

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

这正是您想要实现的目标。 在我看来,无需通过编写自定义Map操作来重新发明轮子。 您也可以在MultiMap上找到本教程 。

你不能,你可以创建自己的地图实现,允许内部重复。

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); }