【问题标题】:Create a merged map with list of maps使用地图列表创建合并地图
【发布时间】:2021-11-04 06:24:54
【问题描述】:

我是 java 新手,所以寻求专家的帮助。任何帮助将不胜感激,并为我提供学习新事物的空间。

我想从另一个地图列表(列表)创建一个地图列表(结果列表),其中单个地图(键)包含作为地图列表键的值(map1,map2,map3 ...所以在)。像下面的例子

Map<String, String> keys = new HashMap<>();
keys.put("Animal","Cow");
keys.put("Bird","Eagle");

Map<String, String> map1 =new HashMap<>();
map1.put("Cow","Legs");
m1.put("Eagle","Wings");

Map<String, String> map2 = new HasMap<>();
map2.put("Cow","Grass");
map2.put("Eagle","Flesh");

List<Map<String, String>> list= new ArrayList<>();
list.add(map1);
list.add(map2); // there could be more

List<Map<String, String>> resultList= new ArrayList<>();
for(Map<String, String> eachMap: listOfMaps){
     Map<String, String> mergedMap = new HasMap<>();
     //help me here
}

现在我希望第一个 map(keys) 的值作为第二个 map(map1) 和第三个 map(map2) 的值的每个新 map(mergedMap) 的键,依此类推。

所需的输出应该是这样的

{ Cow : Legs, Eagle : Wings }
{ Cow : Grass, Eagle : Flesh }
//more

【问题讨论】:

  • 牛必须是每个新地图的关键。不作为单个地图中多个值的键

标签: java collections stream


【解决方案1】:

使用流的另一种方法。

Collection<String> vals = keys.values();
resultList = list.stream()
    .map(eachMap -> vals.stream()
            .filter(eachMap::containsKey)
            .collect(Collectors.toMap(Function.identity(), eachMap::get)))
     .collect(Collectors.toList());
 
System.out.println(resultList);

注意:filter 在创建地图之前检查该值是否存在于地图中。

【讨论】:

  • 你能解释一下 Function.identity() 是什么吗?除了那部分,什么都懂
  • 它是 lambda 表达式 val -&gt; val 的简写/替代形式。基本上,它说使用与地图键相同的值(无转换或映射)。对于地图的值,我们正在查找。 eachMap::get 写成 lambda 表达式时将类似于 val -&gt; eachMap.get(val)
【解决方案2】:

循环遍历每个映射,对于每个映射,遍历keys 映射中的值并在当前映射中查找并将结果插入mergedMap。在处理地图结束时,将mergedMap 添加到resultList

for(Map<String, String> eachMap: list){
     Map<String, String> mergedMap = new HashMap<>();
     for (String val: keys.values()) {
        mergedMap.put(val, eachMap.get(val));
     }
     resultList.add(mergedMap);
}

System.out.println(resultList);

这假定keys 映射中的值将始终存在于每个映射中。如果没有,您必须在添加到 mergedMap 之前检查密钥是否存在(以避免添加 null 值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2020-10-26
    • 2017-12-23
    • 2015-09-27
    • 2020-11-05
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多