Java List - 要素の削除方法及び要素の削除注意点
2010/06/03 15:18Update
Java List の 要素の削除方法及び要素の削除における注意点についてサンプルから解説します。
Java Listの基本的な使い方について、次の記事をご参照ください。
Java List/ArrayListよくある使い方
次のサンプルは、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"は削除されました
簡単なサンプルなので、解説は省略させていただきます。
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"は削除されました
Sponsored Link
- Relative Articles
- Java開発及び実行環境の構築 | Linux篇 - (2008/08/31 20:34)
- Java開発及び実行環境の構築 | Windows篇 - (2008/08/31 21:18)
- 5分でJava Hello World! - (2008/08/31 22:13)
- Java言語の制御構文 - 条件分岐if/else/else if - (2008/10/01 21:30)
- Java言語の繰り返し制御構文 - for文 - (2008/10/03 18:22)
- Java言語の繰り返し制御構文 - do ... while文 - (2008/10/03 21:23)
- Java言語の繰り返し制御構文 - while文 - (2008/10/03 21:32)
- Java言語の基礎 - javacコマンドによるコンパイル - (2008/10/10 17:58)
- Java アクセス修飾子概要 - (2008/10/29 18:31)
- Javaアノテーション機能 概要 - (2009/02/12 13:06)