当前位置: 首页 > 知识库问答 >
问题:

Java流:按键过滤列表组中的映射

贡光明
2023-03-14

有一张单子

[
{
   "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
}
...
]

如何过滤列表,通过名称获得最高的相似性映射组,然后使用Java Stream组合到列表中?结果示例如下:

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

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

ps:如果在多个地图中有相同的相似性值,请将它们全部保留在列表中。

初始代码:

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

共有2个答案

闻人河
2023-03-14

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


        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);
        });
南宫阳冰
2023-03-14

@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. 从每组中获取最大相似值
 类似资料:
  • 我有一个物体,如下所示 给定MyObject的列表,是否可以使用Java8个流来过滤类型和子类型? 目前为止我有 但在这一部分中,我还希望在每个子类型上使用另一个过滤器来过滤特定子类型上的过滤器。我想不出怎么做。 例如 我会传入匹配类型B和子类型Z,所以我希望得到一个结果- 以下当前返回列表中的2个项目。 但是我想在每个子类型上添加一个额外的过滤器,并且只匹配“Z”存在的地方。

  • 问题内容: 我有地图,我想要一个列表,其中按其对应的值对键(最小到最大)进行了排序。我的尝试是: 但这只是给我一个条目列表,如何在不丢失顺序的情况下获得类型列表? 问题答案: 您说要按值排序,但是您的代码中没有。传递一个lambda(或方法引用)来告诉它您想如何排序。 而您想获得钥匙;用于将条目转换为键。

  • 问题内容: 我有两个列表,我要过滤两个列表都包含的thoose元素。我想用lambda表达式做到这一点。 用户getName和客户端getUserName都返回String。 这是我的示例代码: 问题答案: 但这效率很低,因为它是O(m * n)。您最好创建一组可接受的名称: 还要注意,它并不严格等同于您拥有的代码(如果已编译),如果有多个用户具有与该客户端相同的名称,则该客户端会将同一客户端两次

  • 我有map,我想有一个列表,它按键的对应值排序(最小到最大)。我的尝试是:

  • 我有以下方式的地图列表: 我想从地址字段的值中获取地址值。例如, 我想从键值"AddressUsageType"中获取值"PRINCIPAL" 我尝试过使用过滤器和许多其他MAP函数,但最终没有找到合适的解决方案。 这是我的代码片段,获取第一个键值对的值: 以下是上述片段的输出: