你可以做这样的事情。创建一个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。我没有尝试构建最终地图,因为我不知道要为给定的重复列表选择哪个键。