繁体   English   中英

如何在没有ConcurrentModificationException的情况下删除List迭代

[英]How to remove List iteration without ConcurrentModificationException

我的allWordsList类似于: [aaa, bbb, ccc, ddd, eee]

如何进行复印( 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...
        }
    }

}

我经历了几个类似的案例,但仍然不太了解。

您的代码中最大的问题是tempWordsListaWordsList引用同一对象。 您对tempWordsList任何更改aWordsList在同一确切时间发生在aWordsList上:

tempWordsList = aWordsList;

因此, myList会有最后修改的多个副本aWordList

myList.add(tempWordsList);

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

为了制作aWordsListtempWordsList您需要用一个副本替换赋值,如下所示:

tempWordsList = new List<String>(aWordsList);

应该是这样的:

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

解决问题的方法如下,但这并不是一个好的解决方法。

//解决

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...
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM