Эффективная проверка на дубликаты с использованием HashSet
На предыдущем этапе мы использовали вложенные циклы для поиска дубликатов, что просто, но может быть медленно для больших массивов. На этом этапе мы научимся более эффективному способу поиска дубликатов с использованием HashSet
.
HashSet
- это коллекция в Java, которая хранит уникальные элементы. Это означает, что если вы попытаетесь добавить элемент, который уже находится в HashSet
, операция добавления завершится неудачей (точнее, вернет false
). Мы можем использовать это свойство для эффективного обнаружения дубликатов.
Вот идея: мы проходим по массиву, и для каждого элемента пытаемся добавить его в HashSet
. Если метод add()
возвращает false
, это означает, что элемент уже есть в наборе, и, следовательно, он является дубликатом.
Создадим новый Java-файл с именем FindDuplicatesHashSet.java
в каталоге ~/project
.
Откройте файл FindDuplicatesHashSet.java
в редакторе кода и добавьте следующий Java-код:
import java.util.HashSet;
import java.util.Set;
public class FindDuplicatesHashSet {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 2, 7, 8, 8, 3};
// Create a HashSet to store unique elements
Set<Integer> uniqueElements = new HashSet<>();
System.out.println("Finding duplicate elements using HashSet:");
// Iterate through the array
for (int number : numbers) {
// Try to add the element to the HashSet
// If add() returns false, the element is a duplicate
if (!uniqueElements.add(number)) {
System.out.println("Duplicate found: " + number);
}
}
}
}
Рассмотрим новые части этого кода:
import java.util.HashSet;
и import java.util.Set;
: Эти строки импортируют необходимые классы для использования HashSet
.
Set<Integer> uniqueElements = new HashSet<>();
: Эта строка создает пустой HashSet
, который будет хранить объекты Integer
. Мы используем Set
в качестве типа, потому что HashSet
реализует интерфейс Set
.
for (int number : numbers)
: Это расширенный цикл for (также известный как цикл for-each), который представляет собой удобный способ пройти по каждому элементу массива numbers
.
!uniqueElements.add(number)
: Это основная логика. uniqueElements.add(number)
пытается добавить текущий number
в HashSet
. Если число уже присутствует, add()
возвращает false
. Оператор !
инвертирует этот результат, поэтому условие if
истинно только тогда, когда add()
возвращает false
, что указывает на дубликат.
Сохраните файл (Ctrl + S
или Cmd + S
).
Теперь скомпилируйте Java-код в терминале:
javac FindDuplicatesHashSet.java
Если компиляция прошла успешно, запустите программу:
java FindDuplicatesHashSet
Вы должны увидеть вывод, в котором перечислены дубликаты элементов, найденные с использованием метода HashSet
. Обратите внимание, что этот метод обычно быстрее, чем подход с вложенными циклами, особенно для больших массивов, потому что добавление и проверка наличия элементов в HashSet
очень эффективны.