将数据附加到Java中的Map

时间:2011-01-06 09:22:51

标签: java map hashmap

我有一张地图

Map<Integer, List<Object>> entireData;

现在,我正在使用putAll添加一些数据,如

entireData.putAll(someData);

其中someData返回Map<Integer, List<Object>>

现在,我有另一行说

entireData.putAll(someMoreData);

也会返回Map<Integer, List<Object>>,但是通过这样做会覆盖现有的wholeData的内容,我该怎么追加?

6 个答案:

答案 0 :(得分:6)

Java Map Class Reference的第一行:

  

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

答案 1 :(得分:6)

您希望来自MultimapGoogle 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 GuavaApache 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());
        }
    }
}