按键加入两张地图

时间:2014-06-03 14:29:49

标签: java join map merge

我有两张地图:

Map<Integer, String> mapOne = {(1,"a"), (2, "b")};
Map<Integer, Double> mapTwo = {(1,10.0), (2,20.0)};

我想通过Integer值将这些地图合并为一个,所以结果图是

Map<String, Double> mapResult = {("a",10.0), ("b",20.0)};

有没有办法比在条目集上迭代更容易?

3 个答案:

答案 0 :(得分:8)

假设两个映射的键匹配并且映射具有相同数量的条目,使用Java 8,您可以将它写在一行中:

Map<String, Double> map = mapOne.entrySet().stream()
                            .collect(toMap(e -> e.getValue(),
                                           e -> mapTwo.get(e.getKey())));

所以你从第一张地图开始,创建一个新的地图,其中的键是mapOne的值,值是mapTwo中的相应值。

从技术上讲,这有点相当于迭代第一张地图的入口集。

注意:需要import static java.util.stream.Collectors.toMap;

答案 1 :(得分:1)

看起来只有迭代:

@Test
public void testCollection() {
    Map<Integer, String> mapOne = new HashMap<Integer, String>();
    mapOne.put(1, "a");
    mapOne.put(2, "b");
    Map<Integer, Double> mapTwo = new HashMap<Integer, Double>();
    mapTwo.put(1, 10.0);
    mapTwo.put(2, 20.0);


    Map<String, Double> mapResult = new HashMap<String, Double>();
    Set<Integer> keySet = mapOne.keySet();
    keySet.retainAll(mapTwo.keySet());
    for (Integer value : keySet) {
        mapResult.put(mapOne.get(value), mapTwo.get(value));
    }
    System.out.println(mapResult);
}

答案 2 :(得分:0)

如果地图是相同的类型,您可以使用putAll(),但由于您要更改键值对,看起来您将不得不迭代每个整数get()从每张地图,然后put(mapOneVal,mapTwoVal)

for(int i=0;i<max;i++){
    String key = mapOne.get(i);
    Double val = maptwo.get(i);
    if(key!=null && val!=null)
        map3.put(key,val);
}