こんにちは!Fumikoです。
Java使いを目指している真っ只中、Listにはもう慣れましたよね?
事実、ListはJava使いになる最初の関門になります。少し難しいと感じることもあると思いますが、基本を押さえれば、必ず攻略できます。
この記事ではArrayListクラスを例に、
- removeで一つの要素を削除する方法
- clearで要素すべてを削除する方法
- removeAllで指定した値の要素を削除する方法
という基本的な内容から、
- 条件付きで要素を削除する方法
- 範囲指定で要素を削除する方法
などの応用的な使い方に関しても解説していきます。
今回はListの要素を削除する方法について、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
Listの要素を削除する方法
肩慣らしにListの要素を削除するための基本的なメソッドについて紹介します。
- remove
- clear
- removeAll
removeで一つの要素を削除する
要素を一つ削除する場合、Listに入っている要素の順番を指定して削除する方法と、要素の値を指定して削除する方法の2種類あります。
Listに入っているindex番号を指定して削除する場合はremoveメソッドを使います。removeメソッドの引数にはindex番号を指定します。
List内の要素の値を指定して削除する場合はindexOfメソッドを使って、その要素のindex番号を取得する必要があります。List内のindex番号を取得してからremoveメソッドで要素を削除します。
サンプルコードで確認しましょう。
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<String> array = new ArrayList<>(); array.add("侍"); // #1. "侍" array.add("samurai"); // #2. “samurai” array.add("さむらい"); // #3. “さむらい” array.add("サムライ"); // #4. “サムライ” // indexOfメソッドでindex番号を取得 array.remove(array.indexOf("さむらい")); System.out.println(array); } }
実行結果:
[侍, samurai, サムライ]
このサンプルコードではindexOfメソッドを使って、値が“さむらい”の要素のindex番号を取得しています。
removeメソッドの引数に取得したindex番号をセットし、削除しています。
clearで要素すべてを削除する
clearメソッドを使うとList内の要素がすべて削除され、空になります。
サンプルコードで確認しましょう。
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<String> array = new ArrayList<>(); array.add("侍"); // #1. "侍" array.add("samurai"); // #2. “samurai” array.add("さむらい"); // #3. “さむらい” array.add("サムライ"); // #4. “サムライ” array.clear(); System.out.println("要素数は " + array.size() + " です"); } }
実行結果:
要素数は 0 です
removeAllで指定した値の要素を削除
removeAllメソッドはListの要素のなかで指定した値の要素だけをすべて削除します。
例えば、いくつか重複した値を持つ要素がたくさんあり、それらをまとめて削除したい場合などに使用すると便利です。removeAllメソッドは引数にCollection型のオブジェクトを指定する必要があります。
サンプルコードで確認しましょう。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); list1.add("d"); list1.add("e"); // b,c,d を削除したいので、この3つの要素を持つCollectionを生成させる List<String> set = new ArrayList<>(); Collections.addAll(set, "b", "c", "d"); // list1をlist2に退避する List<String> list2 = new ArrayList<>(list1); // 削除前の要素をすべて表示する System.out.println(list2); // b,c,dをlist2から削除する list2.removeAll(set); // 削除後の要素をすべて表示する System.out.println(list2); } }
実行結果:
[a, b, c, d, e] [a, e]
このサンプルコードでは、文字列を格納するListにaddメソッドを使ってアルファベットをいくつか格納しています。
List内の要素を”a”,”e”以外をまとめて削除するために、まずは削除する要素のListをCollection型に変換しています。一旦list1をlist2に退避してからremoveAllメソッドを呼び出し、要素を削除しています。
ラムダ式とremoveIfで要素を条件付きで削除
条件付きでListの要素を削除するにはremoveIfメソッドを使用します。removeifメソッドは引数をラムダ式で指定します。
ラムダ式はJava8の新しい機能の一つです。
List内の要素に対してラムダ式で条件を指定し、該当する要素を削除することができます。サンプルコードで確認しましょう。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("White"); names.add("Yellow"); names.add("Red"); names.add("Blue"); names.add("Black"); // 削除前の要素をすべて表示する System.out.println(names); // namesリストの要素をnameとしてひとつひとつを参照し、nameの文字列が5以上のものを削除します。 names.removeIf(name -> name.length() > 5); // 削除後の要素をすべて表示する System.out.println(names); } }
実行結果:
[White, Yellow, Red, Blue, Black] [White, Red, Blue, Black]
このサンプルコードでは、まずList型のオブジェクトnamesにString型の要素を追加しています。
removeIfメソッドの引数に指定するラムダ式ではnamesの個々の要素を変数nameで参照しています。なお、ラムダ式では変数の型の指定は省略することができます。
この場合、String型の指定が省略されています。変数nameの文字列長さをlengthメソッドを使って取得しています。
文字列の長さが5より大きい場合に参照している要素が削除されます。なお、Java8の新しい機能について、お勧め記事はこちらになります。
ぜひ参考にしてください。
範囲を指定して要素を削除
index番号の範囲を指定して要素を削除することもできます。範囲を指定して削除する方法として2通りの方法があります。
1つ目の方法はsubListメソッドで範囲を指定して、その範囲の要素をclearメソッドを使ってすべて削除する方法です。
2つ目の方法はArrayListクラスのremoveRangeメソッドを使う方法です。
それぞれの方法について、詳しくみていきましょう。
subListで範囲指定する場合
subListメソッドはあるListから必要な範囲だけを取得して新しいListを作る場合に使用します。
subListメソッドは第1引数に範囲の始まりのindex番号を指定します。第2引数には削除したい引数の1つ後のindex番号を指定します。
subListメソッドで範囲を指定し、その範囲の要素をclearメソッドを使ってすべて削除します。サンプルコードで確認しましょう。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("White"); names.add("Yellow"); names.add("Red"); names.add("Blue"); names.add("Black"); // 削除前の要素をすべて表示する System.out.println(names); // index番号が1と2の要素を削除する names.subList(1, 3).clear(); // 削除後の要素をすべて表示する System.out.println(names); } }
実行結果:
[White, Yellow, Red, Blue, Black] [White, Blue, Black]
なおsubListメソッドの使い方の詳しい内容については、こちらを参考にしてくださいね。
removeRangeで範囲指定削除する場合
ArrayListクラスのremoveRangeメソッドは引数にindex番号の範囲を指定して、その範囲の要素を削除します。
removeRangeメソッドの引数の指定はsubListメソッドの引数の指定と同じです。なお、removeRangeメソッドを使用する際には注意が必要です。
removeRangeメソッドはアクセス修飾子protectedで定義されているため、他のクラスから使用することができません。使用するためにはArrayListクラスを継承するサブクラスから呼び出す必要があります。
サンプルコードで確認しましょう。
import java.util.ArrayList; public class Main extends ArrayList{ public static void main(String[] args) { Main names = new Main(); names.add("White"); names.add("Yellow"); names.add("Red"); names.add("Blue"); names.add("Black"); // 削除前の要素をすべて表示する System.out.println(names); // index番号が1と2の要素を削除する names.removeRange(1, 3); // 削除後の要素をすべて表示する System.out.println(names); } }
実行結果:
[White, Yellow, Red, Blue, Black] [White, Blue, Black]
このサンプルコードではremoveRangeを使用するためにMainクラスがArrayListクラスを継承しています。ArrayListクラスのサブクラスMainのオブジェクトnamesからremoveRangeメソッドを呼び出して使用しています。
subListメソッドの引数指定と同じようにremoveRangeメソッドの引数を指定し、指定した範囲の要素を削除しています。
なおprotectedなどのアクセス修飾子についての詳しい解説は、こちらを参考にしてくださいね。
Listに値を追加する方法
Listから要素を消すにはまずは、要素がなければ消せません。
addメソッドを使って要素を追加する方法について、詳しい解説はこちらの記事をご覧ください。
宣言、初期化、要素のソートなどListの使い方
List配列の宣言、初期化、要素のソート、検索などListの使い方についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。
まとめ
いかがでしたか?
今回はListの要素を削除する方法について解説しました。
ひとつ削除する方法やすべて削除する方法、指定の値の要素を削除する方法、条件付きで要素を削除する方法、指定範囲の要素を削除する方法など様々な方法について説明しました。
もしListの要素を削除する方法について忘れてしまったら、この記事を確認してください!