JAvaリストの要素を1サイクルで削除する問題

1263 ワード

次のコードの結果を考えてみましょう.

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i=0;i<list.size();i++){
    list.remove(i);
}
System.out.println(list);

結果は[b,d]であることは誰もが知っているだろう.
1つの要素が削除されると、リストのサイズが縮小して下付き文字が変化し、要素aが削除されると、リストの長さが3になり、リストが[b,c,d]になるので、i=1の場合、実際には要素cが削除され、リストが[b,d]になり、ループが終了する.
次のコードは、有名なC o n c u r r e n tModificationException例外です.

      ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
      for(String s:list){
            if(s.equals("a")){
                list.remove(s);
            }
      }

この問題は、リストを巡回するときに要素を削除することはできません.
解決策は次のとおりです.

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
        String s = iter.next();
        if(s.equals("a")){
            iter.remove();
    }
}