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

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

вопрос задан 15.10.2008
user25778
2130 репутация

36 ответов


  • 866 рейтинг

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

    List al = new ArrayList<>();
    // add elements to al, including duplicates
    Set hs = new HashSet<>();
    hs.addAll(al);
    al.clear();
    al.addAll(hs);
    

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

    ответ дан jonathan-stafford, с репутацией 9240, 15.10.2008
  • 266 рейтинг

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

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

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

    ответ дан abahgat, с репутацией 11227, 15.10.2008
  • 94 рейтинг

    В Java 8:

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

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

    ответ дан Vitalii Fedorenko, с репутацией 66689, 20.04.2014
  • 50 рейтинг

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

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

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

    ответ дан Benno Richters, с репутацией 9008, 15.10.2008
  • 36 рейтинг

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

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

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

    До Java 8

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

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

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

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

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

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

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

    List deDupStringList3 = strList.stream().distinct()
                     .collect(Collectors.toCollection(LinkedList::new));
    
    ответ дан i_am_zero, с репутацией 10225, 24.05.2016
  • 26 рейтинг

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

    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 в соответствии с тем, что вы хотите отстаивать для равенства)

    ответ дан stbn, с репутацией 359, 28.12.2010
  • 22 рейтинг

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

    ImmutableSet.copyOf(list);
    
    ответ дан Timofey Gorshkov, с репутацией 2731, 9.12.2011
  • 21 рейтинг

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

     List 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());
    

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

    ответ дан infoj, с репутацией 441, 12.08.2015
  • 20 рейтинг

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

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

        ArrayList lst = new ArrayList();
        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]
    
    ответ дан CarlJohn, с репутацией 592, 17.10.2013
  • 20 рейтинг

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

    // delete duplicates (if any) from 'myArrayList'
    myArrayList = new ArrayList(new LinkedHashSet(myArrayList));
    
    ответ дан Nenad Bulatovic, с репутацией 4310, 4.11.2016
  • 11 рейтинг

    Возможно, это немного излишне, но мне нравится такая изолированная проблема. :)

    Этот код использует временный набор (для проверки уникальности), но удаляет элементы непосредственно внутри исходного списка. Поскольку удаление элемента внутри ArrayList может вызвать огромное количество копирования массива, метод удаления (int) избегается.

    public static  void removeDuplicates(ArrayList list) {
        int size = list.size();
        int out = 0;
        {
            final Set encountered = new HashSet();
            for (int in = 0; in < size; in++) {
                final T t = list.get(in);
                final boolean first = encountered.add(t);
                if (first) {
                    list.set(out++, t);
                }
            }
        }
        while (out < size) {
            list.remove(--size);
        }
    }
    

    Пока мы здесь, вот версия для LinkedList (намного приятнее! ):

    public static  void removeDuplicates(LinkedList list) {
        final Set encountered = new HashSet();
        for (Iterator iter = list.iterator(); iter.hasNext(); ) {
            final T t = iter.next();
            final boolean first = encountered.add(t);
            if (!first) {
                iter.remove();
            }
        }
    }
    

    Используйте интерфейс маркера, чтобы представить унифицированное решение для списка:

    public static  void removeDuplicates(List list) {
        if (list instanceof RandomAccess) {
            // use first version here
        } else {
            // use other version here
        }
    }
    

    РЕДАКТИРОВАТЬ: Я думаю, что дженерики действительно не добавляет никакой ценности здесь. , Ну что ж. :)

    ответ дан volley, с репутацией 5599, 18.10.2008
  • 10 рейтинг

    это может решить проблему:

    private List clearListFromDuplicateFirstName(List list1) {
    
    Map cleanMap = new LinkedHashMap();
    for (int i = 0; i < list1.size(); i++) {
         cleanMap.put(list1.get(i).getFirstName(), list1.get(i));
    }
    List list = new ArrayList(cleanMap.values());
    return list;
    }
    
    ответ дан user2868724, с репутацией 109, 10.10.2013
  • 9 рейтинг
    public static void main(String[] args){
        ArrayList al = new ArrayList(); al.add("abc"); al.add('a'); al.add('b'); al.add('a'); al.add("abc"); al.add(10.3); al.add('c'); al.add(10); al.add("abc"); al.add(10); System.out.println("Before Duplicate Remove:"+al); for(int i=0;i
    ответ дан Manash Ranjan Dakua, с репутацией 129, 20.09.2015
  • 5 рейтинг

    Если вы хотите использовать стороннюю библиотеку, вы можете использовать метод distinct() в Eclipse Collections (ранее GS Collections).

    ListIterable integers = FastList.newListWith(1, 3, 1, 2, 2, 1);
    Assert.assertEquals(
        FastList.newListWith(1, 3, 2),
        integers.distinct());
    

    Преимущество использования distinct() вместо преобразования в набор и затем обратно в список состоит в том, что distinct() сохраняет порядок исходного списка, сохраняя первое вхождение каждого элемента. Это реализовано с использованием как Set, так и List.

    MutableSet seenSoFar = UnifiedSet.newSet();
    int size = list.size();
    for (int i = 0; i < size; i++)
    {
        T item = list.get(i);
        if (seenSoFar.add(item))
        {
            targetCollection.add(item);
        }
    }
    return targetCollection;
    

    Если вы не можете преобразовать свой исходный список в тип коллекций Eclipse, вы можете использовать ListAdapter для получения того же API.

    MutableList distinct = ListAdapter.adapt(integers).distinct();
    

    Примечание: Я являюсь коммиттером для Eclipse Collections.

    ответ дан Craig P. Motlin, с репутацией 18028, 10.12.2015
  • 3 рейтинг

    Эти три строки кода могут удалить дублированный элемент из ArrayList или любой коллекции.

    List entities = repository.findByUserId(userId);
    
    Set s = new LinkedHashSet(entities);
    entities.clear();
    entities.addAll(s);
    
    ответ дан M Kaweepatt Churcharoen, с репутацией 176, 8.12.2014
  • 2 рейтинг
    ArrayList city=new ArrayList();
    city.add("rajkot");
    city.add("gondal");
    city.add("rajkot");
    city.add("gova");
    city.add("baroda");
    city.add("morbi");
    city.add("gova");
    
    HashSet hashSet = new HashSet();
    hashSet.addAll(city);
    city.clear();
    city.addAll(hashSet);
    Toast.makeText(getActivity(),"" + city.toString(),Toast.LENGTH_SHORT).show();
    
    ответ дан hardip, с репутацией 194, 26.03.2016
  • 2 рейтинг

    код:

    List duplicatList = new ArrayList();
    duplicatList = Arrays.asList("AA","BB","CC","DD","DD","EE","AA","FF");
    //above AA and DD are duplicate
    Set uniqueList = new HashSet(duplicatList);
    duplicatList = new ArrayList(uniqueList); //let GC will doing free memory
    System.out.println("Removed Duplicate : "+duplicatList);
    

    Примечание: Определенно, будут накладные расходы памяти.

    ответ дан sambhu, с репутацией 105, 11.03.2015
  • 2 рейтинг

    Когда вы заполняете ArrayList, используйте условие для каждого элемента. Например:

        ArrayList< Integer > al = new ArrayList< Integer >(); 
    
        // fill 1 
        for ( int i = 0; i <= 5; i++ ) 
            if ( !al.contains( i ) ) 
                al.add( i ); 
    
        // fill 2 
        for (int i = 0; i <= 10; i++ ) 
            if ( !al.contains( i ) ) 
                al.add( i ); 
    
        for( Integer i: al )
        {
            System.out.print( i + " ");     
        }
    

    Получим массив {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    ответ дан HarpyWar, с репутацией 115, 11.04.2011
  • 2 рейтинг

    Если вы хотите сохранить ваш заказ, то лучше всего использовать LinkedHashSet . Потому что, если вы хотите передать этот список в запрос вставки путем его итерации, порядок будет сохранен.

    Попробуйте это

    LinkedHashSet link=new LinkedHashSet();
    List listOfValues=new ArrayList();
    listOfValues.add(link);
    

    Это преобразование будет очень полезно, если вы хотите вернуть список, но не набор.

    ответ дан ramakrishnan, с репутацией 71, 12.10.2013
  • 1 рейтинг

    LinkedHashSet сделает свое дело.

    String[] arr2 = {"5","1","2","3","3","4","1","2"};
    Set set = new LinkedHashSet(Arrays.asList(arr2));
    for(String s1 : set)
        System.out.println(s1);
    
    System.out.println( "------------------------" );
    String[] arr3 = set.toArray(new String[0]);
    for(int i = 0; i < arr3.length; i++)
         System.out.println(arr3[i].toString());
    

    // вывод: 5,1,2,3,4

    ответ дан user1912383, с репутацией 120, 2.01.2013
  • 1 рейтинг
            List result = new ArrayList();
            Set set = new LinkedHashSet();
            String s = "ravi is a good!boy. But ravi is very nasty fellow.";
            StringTokenizer st = new StringTokenizer(s, " ,. ,!");
            while (st.hasMoreTokens()) {
                result.add(st.nextToken());
            }
             System.out.println(result);
             set.addAll(result);
            result.clear();
            result.addAll(set);
            System.out.println(result);
    
    output:
    [ravi, is, a, good, boy, But, ravi, is, very, nasty, fellow]
    [ravi, is, a, good, boy, But, very, nasty, fellow]
    
    ответ дан siva, с репутацией 11, 2.08.2015
  • 1 рейтинг

    Используется для списка пользовательских объектов

    .
       public List removeDuplicates(List list) {
        // Set set1 = new LinkedHashSet(list);
        Set set = new TreeSet(new Comparator() {
    
            @Override
            public int compare(Object o1, Object o2) {
                if (((Contact) o1).getId().equalsIgnoreCase(((Contact) o2).getId()) /*&&
                        ((Contact)o1).getName().equalsIgnoreCase(((Contact)o2).getName())*/) {
                    return 0;
                }
                return 1;
            }
        });
        set.addAll(list);
    
        final List newList = new ArrayList(set);
        return newList;
    }
    
    ответ дан Gujjula Ramesh Reddy, с репутацией 67, 26.03.2017
  • 1 рейтинг

    Вы можете использовать вложенный цикл в следующем:

    ArrayList l1 = new ArrayList();
    ArrayList l2 = new ArrayList();
    
            Iterator iterator1 = l1.iterator();
            boolean repeated = false;
    
            while (iterator1.hasNext())
            {
                Class1 c1 = (Class1) iterator1.next();
                for (Class1 _c: l2) {
                    if(_c.getId() == c1.getId())
                        repeated = true;
                }
                if(!repeated)
                    l2.add(c1);
            }
    
    ответ дан HamidReza, с репутацией 517, 30.11.2017
  • 1 рейтинг

    Если вы используете тип модели Список & lt; Т & GT; / ArrayList & л; Т & GT; , Надеюсь, это поможет вам.


    Вот мой код без использования какой-либо другой структуры данных, такой как set или hashmap

    for(int i = 0; i < Models.size(); i++) {
         for(int j = i + 1; j < Models.size(); j++) {                                
           if(Models.get(i).getName().equals(Models.get(j).getName())){    
                                    Models.remove(j);
    
                                    j--;
                                }
                            }
                        }
    
    ответ дан Saurabh Gaddelpalliwar, с репутацией 91, 9.05.2018
  • 1 рейтинг

    Как было сказано ранее, вы должны использовать класс, реализующий интерфейс Set вместо List, чтобы быть уверенным в уникальности элементов. Если вам нужно сохранить порядок элементов, можно использовать интерфейс SortedSet; класс TreeSet реализует этот интерфейс.

    ответ дан Vinze, с репутацией 2284, 15.10.2008
  • 0 рейтинг
    import java.util.*;
    class RemoveDupFrmString
    {
        public static void main(String[] args)
        {
    
            String s="appsc";
    
            Set unique = new LinkedHashSet ();
    
            for(char c : s.toCharArray()) {
    
                System.out.println(unique.add(c));
            }
            for(char dis:unique){
                System.out.println(dis);
            }
    
    
        }
    }
    
    ответ дан reddy, с репутацией 1, 30.09.2012
  • 0 рейтинг
    for(int a=0;a
    ответ дан Ghyour, с репутацией 11, 22.01.2012
  • 0 рейтинг

    Сложность времени: O (n): без набора

    private static void removeDup(ArrayList listWithDuplicateElements) {
        System.out.println(" Original Duplicate List :" + listWithDuplicateElements);
        List listWithoutDuplicateElements = new ArrayList<>(listWithDuplicateElements.size());
    
        listWithDuplicateElements.stream().forEach(str -> {
            if (listWithoutDuplicateElements.indexOf(str) == -1) {
                listWithoutDuplicateElements.add(str);
            }
        });     
    
        System.out.println(" Without Duplicate List :" + listWithoutDuplicateElements);
    }
    
    ответ дан Sameer Shrestha, с репутацией 31, 17.05.2018
  • 0 рейтинг

    Это правильный вариант (если вы беспокоитесь о накладных расходах HashSet.

     public static ArrayList removeDuplicates (ArrayList arrayList){
        if (arrayList.isEmpty()) return null;  //return what makes sense for your app
        Collections.sort(arrayList, String.CASE_INSENSITIVE_ORDER);
        //remove duplicates
        ArrayList  arrayList_mod = new ArrayList<>();
        arrayList_mod.add(arrayList.get(0));
        for (int i=1; i
    ответ дан seekingStillness, с репутацией 1324, 5.07.2018
  • 0 рейтинг

    Будет ли что-то подобное лучше работать?

    public static void removeDuplicates(ArrayList list) {
    Arraylist ar     = new Arraylist(); Arraylist tempAR = new Arraylist(); while (list.size()>0){ ar.add(list(0)); list.removeall(Collections.singleton(list(0))); } list.addAll(ar); 

    }

    Это должно поддерживать порядок, а также не быть квадратичным во время выполнения.

    ответ дан Ravi Vital, с репутацией 1, 2.12.2015
  • 0 рейтинг
    public Set findDuplicates(List list) { Set items = new HashSet(); Set duplicates = new HashSet(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; } 
    ответ дан Harsha, с репутацией 39, 29.08.2013
  • 0 рейтинг

    Если вы хотите удалить дубликаты из ArrayList, найдите следующую логику:

    public static Object[] removeDuplicate(Object[] inputArray)
    {
        long startTime = System.nanoTime();
        int totalSize = inputArray.length;
        Object[] resultArray = new Object[totalSize];
        int newSize = 0;
        for(int i=0; i
    ответ дан Thananjayan N, с репутацией 51, 11.09.2014
  • 0 рейтинг
        ArrayList list = new ArrayList();
        HashSet unique = new LinkedHashSet();
        HashSet dup = new LinkedHashSet();
        boolean b = false;
        list.add("Hello");
        list.add("Hello");
        list.add("how");
        list.add("are");
        list.add("u");
        list.add("u");
    
        for(Iterator iterator= list.iterator();iterator.hasNext();)
        {
            String value = (String)iterator.next();
            System.out.println(value);
    
            if(b==unique.add(value))
                dup.add(value);
            else
                unique.add(value);
    
    
        }
        System.out.println(unique);
        System.out.println(dup);
    
    ответ дан SparkOn, с репутацией 6657, 13.06.2014
  • 0 рейтинг

    Вот мой ответ без использования какой-либо другой структуры данных, такой как set или hashmap и т. Д.

    public static  ArrayList uniquefy(ArrayList myList) {
    
        ArrayList  uniqueArrayList = new ArrayList();
        for (int i = 0; i < myList.size(); i++){
            if (!uniqueArrayList.contains(myList.get(i))){
                uniqueArrayList.add(myList.get(i));
            }
        }
    
        return uniqueArrayList;
    }
    
    ответ дан neo7, с репутацией 575, 23.09.2015
  • 0 рейтинг

    Решение @ jonathan-stafford в порядке. Но это не сохраняет порядок списка.

    Если вы хотите сохранить порядок списка, вы должны использовать это:

    public static  void removeDuplicate(List  list) {
    Set  set = new HashSet ();
    List  newList = new ArrayList ();
    for (Iterator iter = list.iterator();    iter.hasNext(); ) {
       Object element = iter.next();
       if (set.add((T) element))
          newList.add((T) element);
       }
       list.clear();
       list.addAll(newList);
    }
    

    Это только для завершения ответа. Отлично!

    ответ дан sharkbait, с репутацией 1334, 1.07.2015
  • -1 рейтинг

    В Java List разрешает упорядоченный доступ к своим элементам. Они могут иметь дубликаты, потому что их ключ поиска - это позиция, а не некоторый хеш-код, каждый элемент может быть изменен, пока они остаются в списке, где, поскольку Set представляет коллекцию уникальных элементов, и пока элементы находятся в наборе, их нельзя изменять. Хотя нет никаких ограничений, запрещающих вам изменять элементы в наборе, если элемент изменен, он может навсегда потеряться в наборе.

    public static void main(String[] args) {  
               List l = new ArrayList();  
               l.add("A");  
               l.add("B");  
               l.add("C");  
               l.add("A");  
               System.out.println("Before removing duplicates: ");  
               for (String s : l) {  
                    System.out.println(s);  
               }  
               Set set = new HashSet(l);  
               List newlist = new ArrayList(set);  
               System.out.println("after removing duplicates: ");  
               for (String s : newlist) {  
                    System.out.println(s);  
               }  
          }  
    

    для справки, обратитесь по этой ссылке Как удалить дубликаты из ArrayList

    ответ дан satish, с репутацией 725, 17.11.2015