2014-11-17 3 views
-1

У меня есть этот кусок кода в моем классе, и он бросает java.util.ConcurrentModificationException на выделенные жирным шрифтом строки (обозначенные ** * *)java.util.ConcurrentModificationException в моем коде iter.remove() & iter.add()

public void solve() { 
    **puzzleSolve(set.size(), sequence , set);** 
} 

//private helper method 
protected void puzzleSolve(int k, String s, ArrayList<Character> u){ 


    ListIterator<Character> iter = u.listIterator(); 
    while(iter.hasNext()) 
    { 
     Character c = 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+c , u);** 
     iter.add(c); 
     removeLastChar(s); 


    } 
    } 

} //end of puzzleSolve method 

ответ

4

Каждый из ваших рекурсивных вызовов имеет свой собственный iter. Таким образом, вы изменяете список через несколько итераторов одновременно, что запрещено. Вам нужно будет отредактировать ...

Что касается редизайна - вы можете использовать for (int i = 0; i < u.size(); i++) и удалить из массива i-й элемент, прежде чем делать рекурсивный вызов, а затем вставить его с помощью добавления (i, element).

Я не говорю, что мой хороший дизайн, но он может работать ...

+0

спасибо. вы можете знать, как я должен перепроектировать рекурсивные вызовы? Мне нужно, чтобы это произошло: для каждого символа c в u, я хочу, чтобы algoritjm запускался (множественная рекурсия) и для каждого c в u, он должен сначала удалить c из u и добавить его в S &, а затем в конце сделать все последовательности членов U – LadyM