Java 如何从列表中选择重复值
我将此请求类作为我的对象-Java 如何从列表中选择重复值,java,for-loop,arraylist,foreach,Java,For Loop,Arraylist,Foreach,我将此请求类作为我的对象- public class Request { int id; String name; String address; String mobileNumber; } 我有这个请求列表(上述请求对象列表)—— List requests=new ArrayList(); 请求1=新请求(1,“彼得”、“孟买”、“9439264054”); 请求2=新请求(2,“彼得”、“孟买”、“9439264054”); 请求
public class Request {
int id;
String name;
String address;
String mobileNumber;
}
我有这个请求列表(上述请求对象列表)——
List requests=new ArrayList();
请求1=新请求(1,“彼得”、“孟买”、“9439264054”);
请求2=新请求(2,“彼得”、“孟买”、“9439264054”);
请求3=新请求(3,“马丁”、“孟买海军”、“9004415857”);
请求3=新请求(4,“帕克”、“那格浦尔”、“9004415856”);
请求。添加(请求1);
请求。添加(请求2);
请求。添加(请求3);
请求。添加(请求4);
现在,我只想根据名称、地址和mobileNumber筛选重复的行
基本上,当我过滤时,我的结果应该只包含Request1和Request2
使用java 8或simple for loop的理想方法是什么?您可以实现一个关键方法来识别对象并比较它们以进行复制 请参阅下面的代码段,我使用“u173”作为分隔符,因为姓名和电话号码不包含此字符
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 + '\'' +
'}';
}
}
列表可以按键功能分组,即使用相同键的所有请求都将分组在一起。现在,我们可以检索包含多个元素的列表以查找重复项。请参阅下面可用于示例的代码段
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());
打印输出为:
Request{id=1, name='peter', address='mumbai', mobileNumber='9439264054'}
Request{id=2, name='peter', address='mumbai', mobileNumber='9439264054'}
您必须添加类结构以获得更好的上下文。当除id之外的所有字段都相等时,请求何时重复?(你必须写一个表示重复/等于的函数)@sendhilkumaralasundaram嗨,我刚刚编辑了我的问题。希望这能澄清一些问题。如果你需要更多的细节,请告诉我。这个解决方案确实有效。我现在能找到重复的。你是一个救世主:)但是我看到了这个方法的一个问题。看看下面的示例Request1=新请求(1,“peter”、“mumbai”、“9439264054”);请求2=新请求(2,“彼得”、“孟买”、“9439264054”);请求3=新请求(3,“马丁”、“孟买海军”、“9004415857”);请求4=新请求(4,“马丁”、“孟买海军”、“9004415857”);这不会返回Request1、Request2、Request3、Request4。它将只返回Request1和request2是的,您可以用下面的代码段替换findFirst().get:.flatMap(List::stream).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'}