Усунення Дублікатів за Допомогою Методу distinct()
У реальній розробці часто виникають ситуації, коли дані містять дублікати, які потрібно видалити. Наприклад, уявіть, що ви складаєте список учасників конференції, але через системні помилки деякі імена були записані двічі.
Метод distinct() допомагає вирішити цю проблему, видаляючи дублікати елементів із потоку.
Stream<T> distinct()
Цей метод повертає стрім, що містить лише унікальні елементи, відфільтровуючи всі дублікати.
Як це працює
Метод distinct() використовує hashCode() для швидкого виявлення потенційних дублікатів та equals() для підтвердження, чи є вони дійсно ідентичними. Якщо два об'єкти мають різні хеш-коди, вони вважаються унікальними. Якщо хеш-коди збігаються, викликається equals() для перевірки їхньої рівності за певними критеріями.
Разом ці методи утворюють контракт hashCode() та equals()
контракт, що забезпечує коректне порівняння та видалення дублікатів.
Замість ручного написання їх можна згенерувати автоматично у IntelliJ IDEA.
У IntelliJ IDEA ви відкрили меню генерації коду (Alt + Insert на Windows/Linux, Cmd + N на Mac) і обрали equals() та hashCode(). Після вибору полів для порівняння, IDEA автоматично згенерувала необхідні методи.
Практичний приклад
Фабрика веде облік виготовлених деталей, але у звіті присутні дублікати та дефектні деталі з позначкою DEFECT. Мета — очистити список, залишивши лише унікальні, якісні деталі, відсортувати їх за назвою та відобразити у форматі: Name - Serial Number.
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }
Для видалення дублікатів і фільтрації дефектних деталей необхідно правильно реалізувати методи equals() і hashCode() для порівняння деталей за серійним номером.
Після цього використовується distinct() для усунення дублікатів, filter() для видалення дефектних деталей, що містять DEFECT у назві, sorted() для впорядкування залишених деталей і map() для форматування їх у рядки.
1. Що використовується для порівняння елементів у методі distinct()?
2. Якщо два об'єкти мають однаковий hashCode(), але їхній метод equals() повертає false, чи будуть вони вважатися однаковими у методі distinct()?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 2.33
Усунення Дублікатів за Допомогою Методу distinct()
Свайпніть щоб показати меню
У реальній розробці часто виникають ситуації, коли дані містять дублікати, які потрібно видалити. Наприклад, уявіть, що ви складаєте список учасників конференції, але через системні помилки деякі імена були записані двічі.
Метод distinct() допомагає вирішити цю проблему, видаляючи дублікати елементів із потоку.
Stream<T> distinct()
Цей метод повертає стрім, що містить лише унікальні елементи, відфільтровуючи всі дублікати.
Як це працює
Метод distinct() використовує hashCode() для швидкого виявлення потенційних дублікатів та equals() для підтвердження, чи є вони дійсно ідентичними. Якщо два об'єкти мають різні хеш-коди, вони вважаються унікальними. Якщо хеш-коди збігаються, викликається equals() для перевірки їхньої рівності за певними критеріями.
Разом ці методи утворюють контракт hashCode() та equals()
контракт, що забезпечує коректне порівняння та видалення дублікатів.
Замість ручного написання їх можна згенерувати автоматично у IntelliJ IDEA.
У IntelliJ IDEA ви відкрили меню генерації коду (Alt + Insert на Windows/Linux, Cmd + N на Mac) і обрали equals() та hashCode(). Після вибору полів для порівняння, IDEA автоматично згенерувала необхідні методи.
Практичний приклад
Фабрика веде облік виготовлених деталей, але у звіті присутні дублікати та дефектні деталі з позначкою DEFECT. Мета — очистити список, залишивши лише унікальні, якісні деталі, відсортувати їх за назвою та відобразити у форматі: Name - Serial Number.
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }
Для видалення дублікатів і фільтрації дефектних деталей необхідно правильно реалізувати методи equals() і hashCode() для порівняння деталей за серійним номером.
Після цього використовується distinct() для усунення дублікатів, filter() для видалення дефектних деталей, що містять DEFECT у назві, sorted() для впорядкування залишених деталей і map() для форматування їх у рядки.
1. Що використовується для порівняння елементів у методі distinct()?
2. Якщо два об'єкти мають однаковий hashCode(), але їхній метод equals() повертає false, чи будуть вони вважатися однаковими у методі distinct()?
Дякуємо за ваш відгук!