我有一张地图
Map<Integer, List<Object>> entireData;
现在,我正在使用putAll添加一些数据,如
entireData.putAll(someData);
其中someData返回Map<Integer, List<Object>>
现在,我有另一行说
entireData.putAll(someMoreData);
也会返回Map<Integer, List<Object>>
,但是通过这样做会覆盖现有的wholeData的内容,我该怎么追加?
答案 0 :(得分:6)
Java Map Class Reference的第一行:
将键映射到值的对象。一个 map不能包含重复键; 每个键最多可以映射一个值。
答案 1 :(得分:6)
您希望来自Multimap的Google Guava。用Guava Multimap重写你的例子:
ListMultimap<Integer, Object> entireData = ArrayListMultimap.create();
entireData.get(key)
返回List<Object>
。 putAll
不会覆盖旧密钥,但会将这些密钥的值附加到现有值。这比处理自己初始化List
实例要好得多。
答案 2 :(得分:4)
for (Integer key : someMoreData.keySet())
{
if (entireData.containsKey(key))
{
entireData.get(key).addAll(someMoreData.get(key));
}
else
{
entireData.put(key, someMoreData.get(key));
}
}
答案 3 :(得分:2)
钥匙是独一无二的。如果someMoreData
的密钥与entireData
中已存在的密钥相同,则会覆盖该对象列表。
但是,您可以在someMoreData
中循环并附加entireData
中存在的密钥
for(Integer key: someMoreData.keySet()){
if(entireData.get(key)!=null)
entireData.get(key).addAll(someMoreData.get(key));
else
entireData.put(key,someMoreData.get(key));
}
答案 4 :(得分:2)
默认情况下,Java Maps将一个键映射到一个值as trojanfoe writes。如果这还不足以满足您的需求,您需要一个Multi-Map实现(从一个键映射到一组值的Map)。
最流行的版本可以在两个开源框架Google Guava和Apache Commons / Collections中找到。
番石榴示例:
final Multimap<Integer, String> mmap =
Multimaps.newSetMultimap(
Maps.<Integer, Collection<String>> newHashMap(),
new Supplier<Set<String>>(){
@Override
public Set<String> get(){
return Sets.newHashSet();
}
});
mmap.put(1, "foo");
mmap.put(1, "bar");
System.out.println(mmap.get(1));
输出:
[foo,bar]
Commons Collections示例:
final MultiMap mmap = new MultiHashMap();
mmap.put(1, "foo");
mmap.put(1, "bar");
System.out.println(mmap.get(1));
输出:
[foo,bar]
正如您所看到的,Commons Collections版本更简单,但功能也不那么强大,而且在当前版本中它不支持Java 1.5泛型。所以我会选择番石榴。
答案 5 :(得分:0)
类似于willcodejavaforfood的不需要依赖项的答案,只是使用entrySet来减少HashMap检索。
No match
或Nishant,它会丢弃一个contains调用并添加一个空检查,但带有entrySet
public static <K,V> void appendMapBtoMapA(HashMap<K,List<V>> a, HashMap<K,List<V>> b) {
for (Map.Entry<K, List<V>> bEntry : b.entrySet()) {
if (a.containsKey(bEntry.getKey())) {
a.get(bEntry.getKey()).addAll(bEntry.getValue());
} else {
a.put(bEntry.getKey(), bEntry.getValue());
}
}
}
或使用Java 8
public static <K,V> void appendMapBtoMapA(HashMap<K,List<V>> a, HashMap<K,List<V>> b) {
for (Map.Entry<K, List<V>> bEntry : b.entrySet()) {
List<V> aValue = a.get(bEntry.getKey());
if (aValue != null) {
aValue.addAll(bEntry.getValue());
} else {
a.put(bEntry.getKey(), bEntry.getValue());
}
}
}