首页 > 解决方案 > 如何从列表中获取仅重复对象的列表

问题描述

如何从列表中获取仅重复对象的列表。

我有一个对象的 ArrayList

Pojo Class
Class Abc {
int id ;
String name;
Date startDate;
int rowNum;
......
}

Example Data:
id    name      startDate    rowNum
110   Art       01-Jan-2018   1
120   Art       01-Jan-2019   1
121   Science   01-Jan-2018   2
122   Computer  01-Jan-2018   3
..
190   Math      01-May-2020   40
180   Math      04-Aug-2040   40
456   Math      01-Dec-2060   40

Abc 列表有时包含 - 4000 条或更多记录。我想在单独的列表中获取重复 rowNum 的 id、name、startDate。

Ex: List2 should contains (duplicate records only)
id    name      startDate    rowNum
110   Art       01-Jan-2018   1
120   Art       01-Jan-2019   1
.....
190   Math      01-May-2020   40
180   Math      04-Aug-2040   40
456   Math      01-Dec-2060   40

如何从列表中获取仅重复对象的列表。

标签: javacollectionsjava-stream

解决方案


相等不是通用运算,存在很多方法来检查两个元素是否相等。这就是显式注入equality定义的原因。

另一方面,您的问题可以检索所有重复的元素或仅检索其中一个。

如果您只想要其中一个,则Set操作是解决它的通用解决方案。

使用Java,不存在设置自定义比较器的标准方法,但您可以使用流:

xs.stream()
    .collect(groupingBy(youCustomKey, minBy((a, b) -> 0)))
    .values().stream().map(Optional::get).collect(toList())

在这里,每个重复组(包括单例元素!)只有一个。

如果您希望所有重复的元素yourCustomKey都可以

xs.stream()
    .collect(groupingBy(yourCustomKey, toList()))
    .values().stream()
    .filter(x -> x.size() > 1)
    .flatMap(Collection::stream)
    .collect(toList())

在这里,你得到所有重复的元素。

在这两种情况下,您都可以设置自定义yourCustomKey,因为您说“重复应该基于 rowNum”然后

Function<Abc, Integer> yourCustomKey = Abc::getRowNum;

(显然你可以避免这个定义)。

作为使用字符串的示例:

List<String> xs = asList("aaa", "bb", "rrr", "ff", "qqqq");

List<String> ys1 = xs.stream()
        .collect(groupingBy(String::length, minBy((a, b) -> 0)))
        .values().stream().map(Optional::get).collect(toList());

List<String> ys2 = xs.stream()
        .collect(groupingBy(String::length, toList()))
        .values().stream()
        .filter(x -> x.size() > 1)
        .flatMap(Collection::stream)
        .collect(toList());

System.out.printf("ys1: %s%n", String.join(", ", ys1));
System.out.printf("ys2: %s%n", String.join(", ", ys2));

返回:

ys1: bb, aaa, qqqq
ys2: bb, ff, aaa, rrr

推荐阅读