Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как найти дубликаты в списке

Короткий ответ

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() — Добавляет элемент, если его ещё нет в множестве.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.