【问题标题】:Join two maps by key通过键连接两个地图
【发布时间】:2014-07-23 22:44:33
【问题描述】:

我有两张地图:

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

我想通过整数值将这些映射组合成一个,所以结果映射是

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

有没有比遍历条目集更容易的方法?

【问题讨论】:

  • +3!这个问题有什么有趣的地方?
  • 对我来说,这部分:“有没有比迭代条目集更容易的方法?”
  • 奇怪的要求!包含{ (1,"a"), (2,"b") , (3,"a") } 的地图呢?应该映射哪个 a

标签: java join map merge


【解决方案1】:

假设两个映射的键匹配并且映射具有相同数量的条目,使用 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;

【讨论】:

  • 假设 Java8,并且每个映射中所有 int 键的一对一匹配。 (并不是说在避免这种情况方面做得更好)=P
【解决方案2】:

看起来只有迭代:

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

【讨论】:

    【解决方案3】:

    如果映射是相同的类型,您可以使用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);
    }
    

    【讨论】:

    • 如果地图在序列中有间隙,这可能会导致很多失误。
    • 它可以,并且可以很容易地进行空值检查。否则,它的问题是分别迭代 mapone.keySet() 和 mapTwo.keySet(),然后组合答案。
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2019-08-03
    • 2015-05-30
    • 2018-08-17
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多