Удалить повторные элементы из коллекции

Допустим, у меня есть коллекция, в которой миллион элементов (Double). Необходимо удалить все повторные элементы. Из дубликатов нужно оставить последний элемент. Например для {5,1,5,3,2} вывод должен быть:

{1,5,3,2}

Ответы (1 шт):

Автор решения: Nowhere Man

Для результата нужно использовать LinkedHashSet, который сохранит порядок вставки элементов.

При итерации по входной коллекции нужно удалить существующий элемент и вставить его опять в новую позицию:

public static <T> Set<T> keepLastDupes(Collection<T> data) {
    Set<T> result = new LinkedHashSet<>();

    for (T item : data) {
        if (result.contains(item)) {
            result.remove(item);
        }
        result.add(item);
    }
    return result;
}

Тест:

List<Integer> data = Arrays.asList(5, 1, 5, 3, 2);

Set<Integer> result = keepLastDupes(data);

System.out.println(result);
// -> [1, 5, 3, 2]

При использовании Stream API понадобится кастомный коллектор, который можно получить при помощи Stream::collect(supplier, accumulator, combiner):

public static <T> Set<T> keepLastDupes(Collection<T> data) {
    return data
        .stream()
        .collect(
            LinkedHashSet::new, 
            (acc, item) -> { 
                if (acc.contains(item)) acc.remove(item);
                acc.add(item);
            }, 
            (acc1, acc2) -> acc1.addAll(acc2)
        );
}
→ Ссылка