я получил ConcurrentModificationException при работе с массивами

я использую этот код, чтобы проверить данные в массиве и удалить сходство, но я получил исключение ConcurrentModificationException. это окончательный код после решения всех проблем:

public class Aaa {

    static ArrayList <String>  cmp   = new ArrayList<String>();
    static ArrayList <String>  cpr   = new ArrayList<String>();

    public static void clarify(ArrayList<String> cmp) {

        for (int i = 0; i< cmp.size(); i++){
            cpr.add("null");
        }
        java.util.Collections.copy(cpr, cmp);
        for (String s : cpr){
            int j = 0;
             Iterator<String> itr= cmp.iterator();
              while (itr.hasNext()){
               String t = itr.next();
                 if (s.equals(t)){
                     j++;
                     if (j > 1){
                    itr.remove();
                     }
                }
              }
            }
        for(String x : cmp){
            System.out.println(x);
        }
    }

    public static void main(String args[]){

        cmp.add("hamada");
        cmp.add("ramzy");
        cmp.add("morsy");
        cmp.add("attres");
        cmp.add("hamada");
        cmp.add("el nenny");
        cmp.add("hamada");
        cmp.add("abbas");

        clarify(cmp);       
    }
}

person Muhammed Refaat    schedule 03.05.2013    source источник
comment
Вы вообще это гуглили? Я просто ищу лучший дубликат...   -  person Duncan Jones    schedule 03.05.2013


Ответы (2)


Вы не можете изменить тот же массив, в котором вы выполняете итерацию.

Вы повторяете cmp и пытаетесь изменить то же самое. Это причина вашего исключения.

 for (String s : cpr){
        for(String t : cmp){
            if (t.equals(s)){
                cmp.remove(t);
            }
        }
    }

вместо этого используйте итератор

for (String s : cpr){
 Iterator<String> itr= cmp.iterator();
  while (itr.hasNext()){
   String t = itr.next();
     if (s.equals(t)){
        itr.remove();
    }
  }
}
person NullPointerException    schedule 03.05.2013
comment
это решило для меня проблему исключения, но у меня также есть другая проблема: когда я запускаю программу, я обнаружил, что она удалила все элементы из списка массивов, поскольку она наверняка нашла все элементы, находящиеся в другом списке массивов, но я хочу удалить только дубликаты - person Muhammed Refaat; 03.05.2013
comment
я уже нашел решение для этого, это отредактированный код выше - person Muhammed Refaat; 03.05.2013

Причина в том, что вы удаляете элементы из массива при переборе. Это вызовет ConcurrentModificationExceptions. Если вы хотите удалить элементы во время итерации, лучше всего использовать встроенную функциональность итератора java и метод remove().

Iterator<String> iter = cmp.iterator();
while (iter.hasNext()){
    String t = iter.next();
    if (t.equals(s)){
        iter.remove();
    }
}
person greedybuddha    schedule 03.05.2013
comment
это решило для меня проблему исключения, но у меня также есть другая проблема: когда я запускаю программу, я обнаружил, что она удалила все элементы из списка массивов, поскольку она наверняка нашла все элементы, находящиеся в другом списке массивов, но я хочу удалить только дубликаты - person Muhammed Refaat; 03.05.2013
comment
я уже нашел решение для этого, это отредактированный код выше - person Muhammed Refaat; 03.05.2013