Вопрос-ответ

How do I remove repeated elements from ArrayList?

Как мне удалить повторяющиеся элементы из ArrayList?

У меня есть ArrayList<String>, и я хочу удалить из него повторяющиеся строки. Как я могу это сделать?

Переведено автоматически
Ответ 1

Если вы не хотите дубликатов в a Collection, вам следует подумать, почему вы используете a, Collection который допускает дубликаты. Самый простой способ удалить повторяющиеся элементы - добавить содержимое в Set (что не допускает дубликатов), а затем добавить Set обратно в ArrayList:

Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);

Конечно, это нарушает порядок элементов в ArrayList.

Ответ 2

Хотя преобразование ArrayList в HashSet эффективно удаляет дубликаты, если вам нужно сохранить порядок вставки, я бы предпочел предложить вам использовать этот вариант

// list is some List of Strings
Set<String> s = new LinkedHashSet<>(list);

Затем, если вам нужно получить обратно List ссылку, вы можете снова использовать конструктор преобразования.

Ответ 3

В Java 8:

List<String> deduped = list.stream().distinct().collect(Collectors.toList());

Пожалуйста, обратите внимание, что для правильной работы фильтрации следует соблюдать контракт hashCode-equals для членов списка.

Ответ 4

Предположим, у нас есть список String подобных:

List<String> strList = new ArrayList<>(5);
// insert up to five items to list.

Затем мы можем удалить повторяющиеся элементы несколькими способами.

До Java 8

List<String> deDupStringList = new ArrayList<>(new HashSet<>(strList));

Примечание: Если мы хотим сохранить порядок вставки, нам нужно использовать LinkedHashSet вместо HashSet

Использование Guava

List<String> deDupStringList2 = Lists.newArrayList(Sets.newHashSet(strList));

Использование Java 8

List<String> deDupStringList3 = strList.stream().distinct().collect(Collectors.toList());

Примечание: В случае, если мы хотим собрать результат в конкретной реализации списка, напримерLinkedList, мы можем изменить приведенный выше пример следующим образом:

List<String> deDupStringList3 = strList.stream().distinct()
.collect(Collectors.toCollection(LinkedList::new));

Мы можем использовать parallelStream также в приведенном выше коде, но это не всегда может дать ожидаемый прирост производительности. Подробнее читайте в этом вопросе.

java list collections arraylist