Как выбрать повторяющиеся значения из списка - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть этот класс запросов в качестве моего объекта -

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

Теперь я хочу отфильтровать только дубликаты строк на основе name, address и mobileNumber В основном, когда я фильтрую, мой результат должен содержать только Request1 и Request2 .

. Какой мой идеальный подход был бы при использовании java 8 или просто для l oop?

1 Ответ

1 голос
/ 14 апреля 2020

Вы можете реализовать ключевой метод для идентификации объектов и сравнения их для дублирования.

См. Фрагмент ниже, я использую '_' в качестве разделителя, так как имя и номер телефона не будут содержать этот символ

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

Затем вы можете распечатать список дубликатов с помощью следующего фрагмента:

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

И выводится:

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