Javaセット類ArayListは、特定の要素を削除します。
8541 ワード
今回のプロジェクト開発において、ArayListの一部を動的に削除することに遭遇しました。もし次のようなListがあるならば、
正しいやり方はです。
Listインターフェースの内部は、Iteratorインターフェースを実現し、開発者にiterator()を提供して、現在のlistオブジェクトの一つのiteratorオブジェクトを得る。だから、もっといいやり方があります。
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/