java - 如何从列表中获取仅重复对象的列表
问题描述
如何从列表中获取仅重复对象的列表。
我有一个对象的 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
如何从列表中获取仅重复对象的列表。
解决方案
相等不是通用运算,存在很多方法来检查两个元素是否相等。这就是显式注入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
推荐阅读
- c# - SQL Server - 重复键错误
- peg - 具有任意数量限定符的 PEG 解析声明
- azure - 基于 deviceids 触发 azure 函数
- javascript - 使用 Knockout 从 JSON 编写列表元素
- ios - 快速:滚动集合视图
- elasticsearch - 如何查询具有多个条件的字符串?
- python - Python - PIL 使用 alt 描述从 HTML 文件中保存和重命名图像
- c# - WebBrowser Internet Explorer 版本配置
- visual-studio-code - 我的 VScode 主题总是在打开时恢复为默认的暗+
- anylogic - 对于路径,“getNumberOfTransporters”函数会引发异常