>,java,java-8,java-stream"/>

首页 > 解决方案 > 如何从地图中获取重复值>

问题描述

我有一个 map<String, List object>> 我正在尝试获取具有重复列表值的键


例子:

“一”=[对象,对象1],


“二”=[object2, object3],


“三”=[对象,对象1],

应该返回:

“一”=[对象,对象1]


“三”=[对象,对象1]

标签: javajava-8java-stream

解决方案


你可以做这样的事情。创建一个Map<List<Object>, String>. 只要 Object 正确覆盖equals()并且hashCode()可以比较列表。任何key引用同一组列表对象的原始列表都将根据该重复列表进行分组。要使两个列表相等,列表必须具有相同的顺序。所以我在构建最终地图之前对每个列表进行了排序。因此List<A,B> and list<B,A>将被视为相等。

List<Object> list1 = List.of("MyObject1", "MyObject2");
List<Object> list2 = List.of("MyObject2", "MyObject3");
List<Object> list3 = List.of("MyObject1", "MyObject2");
List<Object> list4 = List.of("MyObject2", "MyObject1");
map.put("One", list1);
map.put("Two", list2);
map.put("Three", list3);
map.put("Four", list3);

Map<List<Object>, List<String>> result = map.entrySet()
        .stream()
        .map(e -> new AbstractMap.SimpleEntry<String, List<Object>>(e.getKey(),
                e.getValue().stream().sorted().toList()))
        .collect(Collectors.groupingBy(Entry::getValue,
                Collectors.mapping(Entry::getKey,
                        Collectors.toList())));

result.entrySet().forEach(System.out::println);

印刷

[MyObject2, MyObject3]=[Two]
[MyObject1, MyObject2]=[One, Four, Three]

所以键One, Three, and Four是指具有相同对象的相同计数的列表。因此,所需要做的就是遍历映射值并找出哪个键列表的大小大于 1。我没有尝试构建最终地图,因为我不知道要为给定的重复列表选择哪个键。


推荐阅读