java.util.ConcurrentModificationException и итерация?

Я очень новичок в Arraylists и итераторах, и это первое исключение. У меня есть ArrayList u, и я хотел бы выполнить следующий алгоритм:

for (Character c:u){

    if(k==1){           //base case

        if(isAnswer(s+u.get(0)))

            System.out.println(s+u.get(0)+" is the correct sequence."+ '\n');
        return;
    }

    else{
        u.remove(c);
        puzzleSolve(k-1, s+c , u);
        u.add(c);
        removeLastChar(s);
    }

    } //end of for each

когда я немного искал это исключение, я обнаружил, что не могу удалить итермы для каждого из массивов, и мне нужно использовать итератор, но я немного запутался, где и как именно я должен поместить время (iter.hasNext()) и тому подобное для этого фрагмента кода. я был бы более чем благодарен, если бы вы могли мне помочь

PS. s — это строка (изначально пустая), а k — int


person LadyM    schedule 17.11.2014    source источник
comment
Возможный дубликат stackoverflow.com/ вопросы/1196586/   -  person slnowak    schedule 17.11.2014


Ответы (3)


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

Iterator<Character> iter = u.iterator();
while (iter.hasNext())
{
    Character currentChar = iter.next();

    if(k==1){           //base case

        if(isAnswer(s+u.get(0)))

        System.out.println(s+u.get(0)+" is the correct sequence."+ '\n');
        return;
    }

    else{
         iter.remove();
         puzzleSolve(k-1, s+currentChar  , u);
         u.add(currentChar);
         removeLastChar(s);
    }

}

person mdnghtblue    schedule 17.11.2014
comment
спасибо, я сделал, но все равно выдает одно и то же исключение в строках: - person LadyM; 17.11.2014
comment
Символ currentChar = iter.next(); - person LadyM; 17.11.2014
comment
и еще одна строка, которую я назвал методом sovePuzzle - person LadyM; 17.11.2014
comment
У меня это отлично работает ... можете ли вы обновить свой пост, указав точную трассировку стека, которую вы получаете? - person mdnghtblue; 17.11.2014

как именно я должен поставить while(iter.hasNext())

Вы можете использовать iterator, как показано ниже:

Iterator<Character> iter = u.iterator();
while(iter.hasNext())
{
  Character c = iter.next();
  .....
}

Инициализируйте свой список с помощью дженериков: List<Character> u = new ArrayList<Character>();

Совет: используйте iter.remove(), iter.add() везде, где это применимо, вместо u.remove() и u.add().

Вам нужно начать здесь: http://www.tutorialspoint.com/java/java_using_iterator.htm

person BatScream    schedule 17.11.2014
comment
а потом весь мой, если еще между ними?! - person LadyM; 17.11.2014
comment
да. Ваш код между ним. Он действует как replacement для enhanced for loop в вашем коде. - person BatScream; 17.11.2014

Когда вы используете цикл foreach, вы используете итератор неявно.

ConcurrentModificationException возникает, когда коллекция модифицируется "одновременно" с прохождением итератора над коллекцией любыми средствами, кроме самого итератора.

Итак, используйте итератор

Iterator<Character> iter = u.iterator();
while (iter.hasNext())

в случаях, когда вам нужно изменить коллекцию в цикле.

person prsmax    schedule 19.11.2014