【问题标题】:How to get duplicated values fom map<String, List<OBJECT>>如何从 map<String, List<OBJECT>> 中获取重复值
【发布时间】:2021-08-12 22:33:44
【问题描述】:

我有一张地图> 我正在尝试获取具有重复列表值的键


例子:

“一”=[object, object1],


“二”=[object2, object3],


“三”=[object, object1],

应该返回:

“一个”=[object, object1]


“三”=[object, object1]

【问题讨论】:

  • 如何定义重复?除了引用相等之外,通常不能比较对象的任何相等性。如果没问题,那么只需使用groupingBy
  • 我将自定义比较器用于对象,在这种情况下,重复项是有两个具有相同值列表的条目
  • 如果您有自定义比较器,那么您应该在问题中记录它。您如何定义列表中的值相同?如何判断两个值是否相同?顺序重要吗?

标签: java java-8 java-stream


【解决方案1】:

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

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。我没有尝试构建最终地图,因为我不知道要为给定的重复列表选择哪个键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多