スライドショースライドショー

【Java入門】Listの要素をremove、removeAllで削除する方法

こんにちは!Fumikoです。

Java使いを目指している真っ只中、Listにはもう慣れましたよね?

難しいところもある
という声がちらほら聞こえてくるような・・・

事実、ListはJava使いになる最初の関門になります。少し難しいと感じることもあると思いますが、基本を押さえれば、必ず攻略できます。

この記事ではArrayListクラスを例に、

  • removeで一つの要素を削除する方法
  • clearで要素すべてを削除する方法
  • removeAllで指定した値の要素を削除する方法
  • という基本的な内容から、

  • 条件付きで要素を削除する方法
  • 範囲指定で要素を削除する方法
  • などの応用的な使い方に関しても解説していきます。

    今回はListの要素を削除する方法について、わかりやすく解説します!

    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の新しい機能について、お勧め記事はこちらになります。

    ぜひ参考にしてください。

    Java8の新機能を徹底解説!(ラムダ式、Streamなど)
    更新日 : 2017年12月20日

    範囲を指定して要素を削除

    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メソッドの使い方の詳しい内容については、こちらを参考にしてくださいね。

    【Java入門】ListをsubListで切り出して新しいListを作る方法
    更新日 : 2017年12月8日

    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などのアクセス修飾子についての詳しい解説は、こちらを参考にしてくださいね。

    【解決Java】アクセス修飾子(protected、privateなど)
    更新日 : 2019年4月9日

    Listに値を追加する方法

    Listから要素を消すにはまずは、要素がなければ消せません。

    addメソッドを使って要素を追加する方法について、詳しい解説はこちらの記事をご覧ください。

    【5分でわかる】Javaで配列に値を追加する方法をわかりやすく解説
    更新日 : 2019年6月3日

    宣言、初期化、要素のソートなどListの使い方

    List配列の宣言、初期化、要素のソート、検索などListの使い方についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。

    JavaのList型とは!?ArrayListの使い方を基礎の基礎から解説!
    更新日 : 2019年4月23日

    まとめ

    いかがでしたか?

    今回はListの要素を削除する方法について解説しました。

    ひとつ削除する方法やすべて削除する方法、指定の値の要素を削除する方法、条件付きで要素を削除する方法、指定範囲の要素を削除する方法など様々な方法について説明しました。

    もしListの要素を削除する方法について忘れてしまったら、この記事を確認してください!

    LINEで送る
    Pocket

    無料でSEからWebエンジニアへ転職しませんか?



    侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

    • システムエンジニアという職業だけどコードが書けない
    • 事務作業が多くスキルがないため将来が不安
    • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
    という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

    弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

    既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

    まずは無料体験レッスンを予約する

    書いた人

    Fumiko

    もの思うゆえに我あり
    花よりは空想(妄想?)にふけるのが好きなため、
    気が付くとなぜか「システム・エンジニア」になってしまっていた。
    わたしが幼少のころはソフトウェア・エンジニアは存在していなかった、ハズ?
    昨今のプログラミング教育の過熱ぶりを傍目にもの思ふ。
    20年、30年後にPG,SEという職は存在しているのだろうか・・・

    おすすめコンテンツ

    あなたにぴったりなプログラミング学習プランを無料で診断!

    プログラミング学習の効率を劇的に上げる学習メソッドを解説