【问题标题】:How to select duplicate values from a list如何从列表中选择重复值
【发布时间】:2020-07-27 11:56:13
【问题描述】:

我有这个 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);

现在我只想根据姓名、地址和手机号码过滤重复的行 基本上,当我过滤时,我的结果应该只包含 Request1 和 Request2

使用 java 8 或简单 for 循环的理想方法是什么?

【问题讨论】:

  • 您必须添加类结构以获得更好的上下文。当除 id 之外的所有字段都相等时,请求何时重复? (您必须编写一个指示重复/等于的函数)
  • @SendhilkumarAlalasundaram 嗨,我刚刚编辑了我的问题。希望这能清除一些空气。如果您需要更多详细信息,请告知。

标签: java for-loop arraylist foreach


【解决方案1】:

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

看下面的sn-p,我用'_'作为分隔符,因为名字和电话号码不会包含这个字符

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 的请求将被分组在一起。现在,我们可以检索其中包含多个元素的列表以查找重复项。请参阅下面可用于您的示例的 sn-p。

    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());

然后您可以使用以下 sn-p 打印重复的列表:

    duplicateRequests.stream().forEach(System.out::println);

打印输出为:

Request{id=1, name='peter', address='mumbai', mobileNumber='9439264054'}
Request{id=2, name='peter', address='mumbai', mobileNumber='9439264054'}

【讨论】:

  • 嘿伙计。这个解决方案确实有效。我现在能够找出重复项。你是救世主:)
  • 但是我发现这种方法存在一个问题。看看下面的例子 Request1 = new Request(1, "peter", "mumbai", "9439264054");请求2 =新请求(2,“彼得”,“孟买”,“9439264054”); Request3 = 新请求(3,“马丁”,“新孟买”,“9004415857”);请求4 =新请求(4,“马丁”,“新孟买”,“9004415857”);这不会返回 Request1、Request2、Request3、Request4。它只会返回 Request1 和 Request2
  • 是的,你可以用下面的 sn-p 替换 findFirst().get: .flatMap(List::stream) .collect(Collectors.toList());
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 2014-11-26
  • 2022-01-16
  • 1970-01-01
  • 2021-03-19
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多