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'}