Как удалить повторяющиеся элементы из ArrayList? - PullRequest
460 голосов
/ 15 октября 2008

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

Ответы [ 38 ]

939 голосов
/ 15 октября 2008

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

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

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

286 голосов
/ 15 октября 2008

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

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

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

118 голосов
/ 20 апреля 2014

В Java 8:

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

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

53 голосов
/ 15 октября 2008

Если вам не нужны дубликаты, используйте Set вместо List. Для преобразования List в Set вы можете использовать следующий код:

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

Если действительно необходимо, вы можете использовать ту же конструкцию для преобразования Set обратно в List.

48 голосов
/ 24 мая 2016

Предположим, у нас есть список 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

Использование гуавы

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 также в приведенном выше коде, но это может не дать ожидаемых преимуществ производительности. Проверьте этот вопрос для более.

27 голосов
/ 04 ноября 2016

Вы также можете сделать это таким образом и сохранить порядок:

// delete duplicates (if any) from 'myArrayList'
myArrayList = new ArrayList<String>(new LinkedHashSet<String>(myArrayList));
27 голосов
/ 28 декабря 2010

Вот способ, который не влияет на порядок составления списка:

ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();

Iterator iterator = l1.iterator();

while (iterator.hasNext()) {
    YourClass o = (YourClass) iterator.next();
    if(!l2.contains(o)) l2.add(o);
}

l1 - исходный список, а l2 - список без повторяющихся элементов. (Убедитесь, что у YourClass есть метод equals в соответствии с тем, что вы хотите отстаивать для равенства)

24 голосов
/ 12 августа 2015

Потоки Java 8 предоставляют очень простой способ удаления дублирующихся элементов из списка. Используя отличный метод. Если у нас есть список городов и мы хотим удалить дубликаты из этого списка, это можно сделать одной строкой -

 List<String> cityList = new ArrayList<>();
 cityList.add("Delhi");
 cityList.add("Mumbai");
 cityList.add("Bangalore");
 cityList.add("Chennai");
 cityList.add("Kolkata");
 cityList.add("Mumbai");

 cityList = cityList.stream().distinct().collect(Collectors.toList());

Как удалить дубликаты элементов из массива

22 голосов
/ 10 декабря 2011

Существует также ImmutableSet из Гуава в качестве опции ( здесь - документация):

ImmutableSet.copyOf(list);
20 голосов
/ 17 октября 2013

Можно удалить дубликаты из массива без использования HashSet или еще одного массива .

Попробуйте этот код ..

    ArrayList<String> lst = new ArrayList<String>();
    lst.add("ABC");
    lst.add("ABC");
    lst.add("ABCD");
    lst.add("ABCD");
    lst.add("ABCE");

    System.out.println("Duplicates List "+lst);

    Object[] st = lst.toArray();
      for (Object s : st) {
        if (lst.indexOf(s) != lst.lastIndexOf(s)) {
            lst.remove(lst.lastIndexOf(s));
         }
      }

    System.out.println("Distinct List "+lst);

Вывод

Duplicates List [ABC, ABC, ABCD, ABCD, ABCE]
Distinct List [ABC, ABCD, ABCE]
...