java - 如何从列表中选择重复值
问题描述
我有这个 Request 类作为我的对象 -
public class Request {
int id;
String name;
String address;
String mobileNumber;
}
我有这个请求列表(上面的请求对象列表)-
List<Request> requests = new ArrayList();
Request1 = new Request(1, "peter", "mumbai", "9439264054");
Request2 = new Request(2, "peter", "mumbai", "9439264054");
Request3 = new Request(3, "martin", "navi mumbai", "9004415857");
Request3 = new Request(4, "parker", "nagpur", "9004415856");
requests.add(Request1);
requests.add(Request2);
requests.add(Request3);
requests.add(Request4);
现在我只想根据姓名、地址和 mobileNumber过滤重复的行 基本上当我过滤时,我的结果应该只包含 Request1 和 Request2。
使用 java 8 或简单的 for 循环的理想方法是什么?
解决方案
您可以实现一个关键方法来识别对象并比较它们是否重复。
请参阅下面的代码段,我使用“_”作为分隔符,因为姓名和电话号码不包含此字符
private class Request {
private final int id;
private final String name;
private final String address;
private final String mobileNumber;
public Request(final int id, final String name, final String address, final String mobileNumber) {
this.id = id;
this.name = name;
this.address = address;
this.mobileNumber = mobileNumber;
}
public String getKey() {
return name + "_" + address+ "_" + mobileNumber;
}
@Override
public String toString() {
return "Request{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
", mobileNumber='" + mobileNumber + '\'' +
'}';
}
}
该列表可以通过key函数进行分组,即所有具有相同key的请求将被分组在一起。现在,我们可以检索其中包含多个元素的列表以查找重复项。请参阅下面可用于您的示例的代码段。
requests.add(Request1); requests.add(Request2); requests.add(Request3); requests.add(Request4);
final List<Request> duplicateRequests = requests.stream()
.collect(Collectors.groupingBy(Request::getKey)) // group requests by key
.entrySet()
.stream()
.filter(e -> e.getValue().size() > 1) // If duplicates exist
.map(Map.Entry::getValue) // get the duplicate values
.flatMap(List::stream) // collect the duplicates in a new list
.collect(Collectors.toList());
然后,您可以使用以下代码段打印重复项列表:
duplicateRequests.stream().forEach(System.out::println);
打印输出为:
Request{id=1, name='peter', address='mumbai', mobileNumber='9439264054'}
Request{id=2, name='peter', address='mumbai', mobileNumber='9439264054'}
推荐阅读
- mysql - 如何使用 node.js 创建与 mysql 的等待连接
- awesome-wm - 发生鼠标点击时如何防止真棒改变焦点?
- go - 如何在go中打印反斜杠?
- javascript - 如何在路由中动态加载组件
- regex - 如何使用正则表达式仅检索单词
- c# - SQL Server 中的选择语句
- arrays - Powershell - Where-Clause 多个 JSON 数组键
- c++ - 为什么不能用常量表达式声明数组?
- mysql - 在 Window 10 中的同一 MySql 实例上克隆 MySQL 数据库
- python - Python - 使用 pyplot 将二维数组映射到网格?