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

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

Ответы [ 38 ]

1 голос
/ 30 ноября 2017

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

ArrayList<Class1> l1 = new ArrayList<Class1>();
ArrayList<Class1> l2 = new ArrayList<Class1>();

        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);
        }
1 голос
/ 26 марта 2017

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

   public List<Contact> removeDuplicates(List<Contact> 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;
}
1 голос
/ 15 октября 2008

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

1 голос
/ 02 января 2013

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

String[] arr2 = {"5","1","2","3","3","4","1","2"};
Set<String> set = new LinkedHashSet<String>(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

1 голос
/ 02 августа 2015
        List<String> result = new ArrayList<String>();
        Set<String> set = new LinkedHashSet<String>();
        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]
0 голосов
/ 22 января 2012
for(int a=0;a<myArray.size();a++){
        for(int b=a+1;b<myArray.size();b++){
            if(myArray.get(a).equalsIgnoreCase(myArray.get(b))){
                myArray.remove(b); 
                dups++;
                b--;
            }
        }
}
0 голосов
/ 13 июня 2014
    ArrayList<String> list = new ArrayList<String>();
    HashSet<String> unique = new LinkedHashSet<String>();
    HashSet<String> dup = new LinkedHashSet<String>();
    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);
0 голосов
/ 08 февраля 2019
Set<String> strSet = strList.stream().collect(Collectors.toSet());

Самый простой способ удалить дубликаты.

0 голосов
/ 02 декабря 2015

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

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

}

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

0 голосов
/ 17 ноября 2015

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

public static void main(String[] args) {  
           List<String> l = new ArrayList<String>();  
           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<String> set = new HashSet<String>(l);  
           List<String> newlist = new ArrayList<String>(set);  
           System.out.println("after removing duplicates: ");  
           for (String s : newlist) {  
                System.out.println(s);  
           }  
      }  

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

...