Javaセット類ArayListは、特定の要素を削除します。

8541 ワード

今回のプロジェクト開発において、ArayListの一部を動的に削除することに遭遇しました。もし次のようなListがあるならば、
List<Integer> list = new LinkedList<Integer>();
list.add(4);
list.add(2);
list.add(1);
list.add(1);
list.add(2);
誤りのある方法:
for(int i = 0, len = list.size(); i < len; i++){  
    if(list.get(i) == 1) {  
       list.remove(i);  
    }  
}
上記のような方式は以下の異常を投げます。
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3  
    at java.util.ArrayList.RangeCheck(Unknown Source)  
    at java.util.ArrayList.get(Unknown Source)
要素は削除されましたが、反復の下付きは変更されていません。このように反復が最後になると投げられます。
正しいやり方はです。
for(int i = 0, len = list.size(); i < len; i++){  
    if(list.get(i) == 1){  
       list.remove(i);  
       len--;
       i--;
    }  
}
より良い方法
Listインターフェースの内部は、Iteratorインターフェースを実現し、開発者にiterator()を提供して、現在のlistオブジェクトの一つのiteratorオブジェクトを得る。だから、もっといいやり方があります。
Iterator<Integer> iterator = list.iterator();  
while(iterator.hasNext()){  
    int i = iterator.next();  
    if(i == 1){  
        iterator.remove();  
    }  
}


http://stormzhang.github.io/java/2014/05/29/java-list-remove-specific-value/