【问题标题】:Java Stream: filter maps in list group by keyJava Stream:按键过滤列表组中的地图
【发布时间】:2021-12-24 12:43:40
【问题描述】:

有一个列表(List>)如下:

[
{
   "name": "Wall Street",
   "point" "Walls Street",
   "similarity" : "0.945"
},
{
   "name": "Wall Street",
   "point" "Walldd Street",
   "similarity" : "0.871
},
{
   "name": "Duck Street",
   "point" "Ducks duck",
   "similarity" : "0.765
},
{
   "name": "Duck Street",
   "point" "yelow duck",
   "similarity" : "0.563
}
...
]

如何过滤列表,通过name得到最高的similarity映射组,然后使用Java Stream组合成列表? 结果示例为:

[
{
   "name": "Wall Street",
   "point" "Walls Street",
   "similarity" : 0.945
},

{
   "name": "Duck Street",
   "point" "Ducks duck",
   "similarity" : 0.765
}
...
]

ps:如果多张地图中有相同的similarity值,请将它们都保留在列表中。

初始代码:

    List<HashMap<String, String>> res = new ArrayList<>();

    HashMap<String, String> map1 = new HashMap<>();
    map1.put("name", "Wall Street");
    map1.put("point", "Walls Street");
    map1.put("similarity", "0.945");

    HashMap<String, String> map2 = new HashMap<>();
    map2.put("name", "Wall Street");
    map2.put("point", "Walldd Street");
    map2.put("similarity", "0.871");

    HashMap<String, String> map3 = new HashMap<>();
    map3.put("name", "Duck Street");
    map3.put("point", "Ducks duck");
    map3.put("similarity", "0.765");

    HashMap<String, String> map4 = new HashMap<>();
    map4.put("name", "Duck Street");
    map4.put("point", "yelow duck");
    map4.put("similarity", "0.563");

    res.add(map1);
    res.add(map2);
    res.add(map3);
    res.add(map4);

【问题讨论】:

标签: java java-stream


【解决方案1】:

@Falah 提供的解决方案的一些更改

List<Map<String, String>> result = res.stream().collect(Collectors.groupingBy(map->map.get("name")))
                                .entrySet().stream().map(m -> m.getValue().stream()
                                        .max(Comparator.comparingDouble(s -> Double.parseDouble(s.get("similarity")))).get())
                                .collect(Collectors.toList());
  1. 按名称分组
  2. 从每个组中获取最大相似度值

【讨论】:

    【解决方案2】:

    先按名称分组,然后按最大相似度分组

    
            List<Map.Entry<String, Optional<HashMap<String, String>>>> result = res.stream()
                   .collect(Collectors.groupingBy(
                           map -> map.get("name"),
                           Collectors.maxBy(Comparator.comparingDouble(o -> Double.parseDouble(o.get("similarity"))))
                   )).entrySet().stream().toList();
    
    
            result.forEach((map) -> {
                System.out.print("Max similarity of  " + map.getKey() + " is : ");
                map.getValue().ifPresent(System.out::println);
            });
    

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2021-01-29
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多