JAvaリストの要素を1サイクルで削除する問題
1263 ワード
次のコードの結果を考えてみましょう.
結果は[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(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();
}
}