我想在哈希映射中添加重复的元素。
因此:
因此:
put("name1", 1);
put("name1", 3);
put("name1", 3);
put("name2", 1);
put("name2", 3);
我该如何做到这一点?
put("name1", 1);
put("name1", 3);
put("name1", 3);
put("name2", 1);
put("name2", 3);
我该如何做到这一点?
使用 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);
}
来自Guava的ListMultimap接口可能符合您的要求。它允许重复的键和重复的键/值对。
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]
ListMultimap
。 SetMultimap
不允许重复的键/值对,但在示例输入中有一个。那篇文章有点过时了。Google Collections已经合并到Guava中。 - finnwHashMultimap
允许重复的键,但不允许重复的键/值对。如果你将示例条目插入 HashMultimap
中,最终只有一个 name1=3
条目。 - finnworg.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);
}