2015-11-03 70 views
2

allWordsList是这样的:[aaa, bbb, ccc, ddd, eee]如何删除列表迭代,而不ConcurrentModificationException的

如何使allWordsList复印件(tempWordsList)在

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

在你的代码的最大问题是,tempWordsListaWordsList指向同一个对象。您对tempWordsList发生任何变化,以aWordsList在相同的确切时间:

tempWordsList = aWordsList; 

因此,myList将有aWordList最后一次修改的多个副本:

myList.add(tempWordsList); 

添加相同的对象myList在循环的每次迭代中。

为了使aWordsListtempWordsList你需要一个副本替换分配,像这样:

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

已解决!你是绝对正确的,... tempWordsList = new列表(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... 
    } 
相关问题