2015-11-03 4 views
2

Мой allWordsList что-то вроде: [aaa, bbb, ccc, ddd, eee]Как удалить список итерацию без ConcurrentModificationException

Как сделать копию (tempWordsList) из allWordsList в

for (String aWord : aWordsList) 

без элемента итерации (т.е. для достижения [bbb, ccc, ddd, eee], то [aaa, ccc, ddd, eee] , и т.д...)?

public class Anagrams { 

    List<String> allWordsList = new ArrayList<String>(); 
    List<List<String>> myList = new ArrayList<List<String>>(); 
    List<String> tempWordsList = new ArrayList<String>(); 

    public Anagrams(String allWords) { 
     getWordsList(allWordsList, allWords); // getting List to copy here 
     getAnagramWordsList(allWordsList); 
    } 

    private void getAnagramWordsList(List<String> aWordsList) { 
     for (String aWord : aWordsList){ 
      //tempWordsList.clear(); 
      tempWordsList = aWordsList; 
      for (Iterator<String> iterator = tempWordsList.iterator(); iterator.hasNext();) { 
       String string = iterator.next(); 
       if (string == aWord) { 
        // Remove the current element from the iterator and the list. 
        iterator.remove(); 
       } 
      } 
      myList.add(tempWordsList); 
      System.out.println(aWordsList); 
      System.out.println(tempWordsList); //before error both lists are without first item... 
     } 
    } 

} 

Я прошел через пару подобных случаев, но до сих пор не понимаю его хорошо.

+0

Вы можете изменить свой 'iterator' цикл в' for' цикла. Таким образом, вы можете удалить индекс, равный «aWord» –

+2

. Вы должны использовать .equals() для строки, а не == –

ответ

2

Самая большая проблема в вашем коде, что tempWordsList и aWordsList относятся к одному объекту. Любые изменения, которые вы вносите в tempWordsList происходит с aWordsList в то же самое точное время:

tempWordsList = aWordsList; 

Поэтому myList будет иметь несколько копий последней модификации aWordList:

myList.add(tempWordsList); 

добавляет тот же объект myList на каждой итерации цикла.

Для того, чтобы сделать aWordsList и tempWordsList вам нужно заменить задание с копией, например:

tempWordsList = new List<String>(aWordsList); 
+0

SOLVED! вы абсолютно правы, ... tempWordsList = новый Список (aWordsList); – mallorn

1

Это должно быть так:

Iterator<String> it = tempWordsList.iterator(); 
while(it.hasNext()){ 
    String value = it.next(); 
    // System.out.println("List Value:"+value); 
    if (value.equals(aWord)) { 
     it.remove(); 
     } 
    } 
1

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

// Решить

private void getAnagramWordsList(List<String> aWordsList) { 

    List<Integer> toRemove = new ArrayList<Integer>(); 

    for (String aWord : aWordsList){ 
     //tempWordsList.clear(); 
     tempWordsList = aWordsList; 

     for (int i = tempWordsList.size()-1; i > 0; i--) { 
      if (string.equals(tempWordsList.get(i)) { 
       toRemove.add(i); 
      } 
     } 
     for(int idx = 0; idx < toRemove.size(); idx++) 
      tempWordsList.remove(idx); 

     myList.add(tempWordsList); 

     System.out.println(aWordsList); 
     System.out.println(tempWordsList); //before error both lists are without first item... 
    } 
Смежные вопросы