2011年12月7日水曜日

JavaのArrayListの削除時の注意点


AndroidやJavaではよくArrayListを頻繁に使用する。
特にAndroidではListViewにアタッチする時によく利用されるようだ。
そこで私がしでかした失敗談を一つ。



ArrayListの要素を削除する場合removeメソッドを使用する。
このremoveメソッドは要素を削除した場合
indexも変更になる事に気をつけなければならない。
例えば

ArrayList<String> arrayList = new ArrayList<String>[];
arrayList.add("AAA");
arrayList.add("BBB");
arrayList.add("CCC");

とした際にまとめて削除したい場合
for( int i = 0 ; i < arrayList.size() ; i++ ){
    arrayList.remove(i);
}
とかするとエラーになってしまう。
なぜならsizeで取得した時点の要素数は3だが
removeを実行した瞬間にsizeが変わる。
index0番目(i=0)に相当するAAAを削除したらsizeはその時点で2になるのだ。
そしてindex1番(i=1)はBBBを指してはおらずCCCを指す事になる。
この時点でBBBは残りCCCは削除されるが
次のindex2番(i=2)はremoveをかけた瞬間にエラーとなる。
そう。要素が既に無いのだ。
3個消したい場合これではだめ。
全部消したいのなら
arrayList.clear()とするか
for( int i = 0 ; i < arrayList.size() ; i++ ){
    arrayList.remove(0);
}
などとすればよいだろう。
だが例えば「1番目と3番目を削除したい」としたらどうだろう。
理論的にはindex0を削除したあとindex1を削除すればいいのだが・・・。
「減っていくなら最後の方から削除すればいいのに」という声が聞こえた。

for( int i = arrayList.size() - 1 ; i >= 0 ; i-- ){
    if ( i == 0 ){
        arrayList.remove(i);
    }
    if ( i == 2 ){
        arrayList.remove(i);
    }
}

こんな感じ?

0 件のコメント:

コメントを投稿

Windows10 1803の再インストールした時のメモ

今日はちょっとしたメモを残そうと思って書き込みしています。 事の発端は大きいファイルを整理している最中にエラーが頻発した事から始まります。