首页 > 解决方案 > 如何从列表中选择重复值

问题描述

我有这个 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 循环的理想方法是什么?

标签: javafor-looparraylistforeach

解决方案


您可以实现一个关键方法来识别对象并比较它们是否重复。

请参阅下面的代码段,我使用“_”作为分隔符,因为姓名和电话号码不包含此字符

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

推荐阅读