java - 如何从地图中获取重复值>
问题描述
我有一个 map<String, List object>> 我正在尝试获取具有重复列表值的键
例子:
“一”=[对象,对象1],
“二”=[object2, object3],
“三”=[对象,对象1],
应该返回:
“一”=[对象,对象1]
“三”=[对象,对象1]
解决方案
你可以做这样的事情。创建一个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。我没有尝试构建最终地图,因为我不知道要为给定的重复列表选择哪个键。
推荐阅读
- kotlin - 使用其他地方的内部对象访问 Kotlin 外部类
- sql - 我该如何编写这个约束?
- c# - 如何在益智游戏中实现命令模式
- javascript - 如何将一个html文件中的href标签链接到下一个html页面中的iframe标签
- sql - 为列选择 date_trunc 函数
- java - 我该如何缩短这个
- cytoscape.js - 如何在 cytoscape.js 中将 ID 引用为变量
- firebase - firebase 导出是否将照片和图像保存在导出本身的数据库中?
- c# - 如何读取存储在 Azure 密钥保管库中的值/秘密
- python - 对于带有 pytest-cov 的 pytest:如何为覆盖版本 >= 5 指定 parallel=True