Как найти дубликаты в списке
Короткий ответ
Set.add() возвращает false, если элемент уже был. Соберите такие элементы в отдельное множество:
void main() {
var items = List.of("a", "b", "a", "c", "b", "a");
var seen = new HashSet<String>();
var duplicates = new LinkedHashSet<String>();
for (String item : items) {
if (!seen.add(item)) {
duplicates.add(item);
}
}
IO.println(duplicates);
}Результат:
[a, b]Со счётчиком
Группировка показывает, сколько раз повторяется каждый элемент:
void main() {
var items = List.of("a", "b", "a", "c", "b", "a");
var repeated = items.stream()
.collect(Collectors.groupingBy(s -> s, TreeMap::new, Collectors.counting()))
.entrySet().stream()
.filter(e -> e.getValue() > 1)
.toList();
IO.println(repeated);
}Результат:
[a=3, b=2]Есть ли повторы
Если нужен только ответ «да» или «нет», сравните размер списка и множества:
void main() {
var ids = List.of(1, 2, 3, 2);
IO.println(new HashSet<>(ids).size() != ids.size());
}Результат:
trueЧастая ошибка
Искать повторы двумя вложенными циклами. Это работает, но на 100 000 элементах выполняет миллиарды сравнений. HashSet проходит список один раз.
Функции из этого ответа
- HashSet — Множество без повторов на основе хеш-таблицы; порядок не гарантирован.
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
- Collections.frequency() — Считает, сколько раз элемент встречается в коллекции.
- Set.add() — Добавляет элемент, если его ещё нет в множестве.