Java List - 要素の削除方法及び要素の削除注意点

2010/06/03 15:18Update
TAGS: Java | List | リスト | 削除 | remove

Java List の 要素の削除方法及び要素の削除における注意点についてサンプルから解説します。

Java Listの基本的な使い方について、次の記事をご参照ください。
Java List/ArrayListよくある使い方

次のサンプルは、Listの要素の削除方法及び要素削除の問題点について解説します。

例:
package com.test.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Java List要素の削除についてシンプルなサンプル
 * 
 * 
 */
public class TestListRemove {
    @SuppressWarnings("unchecked")
    public static void main(String []args) {
        ////////////////////////////////////
        //1)ArrayListからListのインスタンスを生成
        List list = getList();  // "a", "b", "c", "d", "e"
        
        /////////////////////////////////////////////////////////
        //要素の削除例
        //インデックスによる要素の削除
        list.remove(1); //2番目の要素"b"をリストから削除
        printlnList("1", list);      //List出力
        System.out.print("\t\t//\"b\"は削除されました");
        
        //オブジェクトによる要素の削除
        list.remove("c");   //"c"という要素をリストから削除
        printlnList("2", list);      //List出力
        System.out.print("\t\t//\"c\"は削除されました");
        
        //こんな削除方法があった場合は要注意
        //例1:(NG例)
        list = getList();  // リストを再構築
        for (int i=0; i<list.size(); i++) {
            Object ele = list.get(i);
            if (ele.equals("a") || ele.equals("b")) {
                list.remove(i);     //1回の削除で、インデックスは変わりますので。2回目の削除は期待の結果になりません
            }
        }
        printlnList("3", list);      //List出力
        System.out.print("\t\t//例1:(NG例)- \"b\"は削除されるはずだが、削除されていない。");
        
        //例2:(例1のOK例)
        list = getList();  // リストを再構築
        for (int i=list.size()-1; i>=0; i--) {
            Object ele = list.get(i);
            if (ele.equals("a") || ele.equals("b")) {
                list.remove(i);     //リストの後ろから削除。そうすれば、削除されても、既存要素のインデックスは変わることはありません。
            }
        }
        printlnList("4", list);      //List出力
        System.out.print("\t\t//例2:(例1のOK例)");
        
        //例3:(NG例)
        list = getList();  // リストを再構築
        try {
            for (Object ele : list) {
                if (ele.equals("a") || ele.equals("b")) {
                    list.remove(ele);     //これもだめ。
                }
            }
        } catch (Exception e) {
            
            System.out.println("\n\t\t****Exception?****");
            e.printStackTrace();    //異常を出力
            
        }
        printlnList("5", list);      //List出力
        System.out.print("\t\t//例3:(NG例)- \"b\"は削除されるはずだが、削除されていない。");
        
        //例4:(例3のOK例)
        list = getList();  // リストを再構築
        for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
            String ele = iterator.next();
            if (ele.equals("a") || ele.equals("b")) {
                iterator.remove();      //要素を削除
            }
        }
        printlnList("6", list);      //List出力
        System.out.print("\t\t//例4:(例3のOK例)\"a\", \"b\"は削除されました");
    }
    
    /**
     * List構築
     * @return
     */
    @SuppressWarnings("unchecked")
    private static List <String> getList() {
        List list = new ArrayList();
        
        ////////////////////////////////////
        //2)Listに要素の追加
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        
        return list;
    }
    
    /**
     * List出力
     * @param list
     */
    private static void printlnList(String message, List <String> list) {
        System.out.println();
        System.out.print(message + ": {");
        for (String ele:list) {
            System.out.print(" \"" + ele + "\", ");
        }
        System.out.print("}");
        
    }
}


実行結果
1: { "a",  "c",  "d",  "e", }        //"b"は削除されました
2: { "a",  "d",  "e", }        //"c"は削除されました
3: { "b",  "c",  "d",  "e", }        //例1:(NG例)- "b"は削除されるはずだが、削除されていない。
4: { "c",  "d",  "e", }        //例2:(例1のOK例)
        ****Exception?****
java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    at com.test.list.TestListRemove.main(TestListRemove.java:60)

5: { "b",  "c",  "d",  "e", }        //例3:(NG例)- "b"は削除されるはずだが、削除されていない。
6: { "c",  "d",  "e", }        //例4:(例3のOK例)"a", "b"は削除されました
簡単なサンプルなので、解説は省略させていただきます。

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments