Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでArrayListから部分リスト(SubList)を削除する方法を解説

subList()メソッドとclear()メソッドを組み合わせる方法

ListインターフェースのsubList()メソッドは、要素のインデックスを表す2つの整数値を引数に受け取り、現在のListオブジェクトのうち、指定されたインデックス範囲に該当する部分リスト(ビュー)を返します。

また、clear()メソッドは、現在のListオブジェクトからすべての要素を削除するメソッドです。

この2つのメソッドを組み合わせれば、ArrayListから任意の範囲の要素をまとめて削除できます。手順はとてもシンプルで、削除したい部分リストの境界となるインデックスを指定して、次のように呼び出すだけです。

obj.subList(fromIndex, toIndex).clear();

ここでのポイントは、subList()が返すのが元のリストのコピーではなく「ビュー」であるという点です。ビューに対してclear()を実行すると、その変更は元のArrayListにも反映され、該当範囲の要素が実際に削除されます。なお、fromIndexがtoIndexより大きい場合や、インデックスがリストの範囲外の場合にはIndexOutOfBoundsExceptionがスローされるため、引数の指定には注意してください。

サンプルコード

import java.util.ArrayList;
public class RemovingSubList {
    public static void main(String[] args){
        // ArrayListオブジェクトの生成
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFX");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        list.add("OpenNLP");
        list.add("JOGL");
        list.add("Hadoop");
        list.add("HBase");
        list.add("Flume");
        list.add("Mahout");
        list.add("Impala");
        System.out.println("ArrayListの内容: \n"+list);
        // インデックス4〜8の部分リストを削除
        list.subList(4, 9).clear();
        System.out.println("部分リスト削除後のArrayListの内容: \n"+list);
    }
}

実行結果

ArrayListの内容:
[JavaFX, Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala]
部分リスト削除後のArrayListの内容:
[JavaFX, Java, WebGL, OpenCV, Mahout, Impala]

この例では、subList(4, 9)によってインデックス4番目の「OpenNLP」からインデックス8番目の「Flume」までの5つの要素が削除され、リストには「JavaFX」「Java」「WebGL」「OpenCV」「Mahout」「Impala」だけが残ります。

removeRange()メソッドを使う方法

AbstractListクラスのremoveRange()メソッドも、要素のインデックスを表す2つの整数値を引数に受け取り、現在のArrayListからその範囲の要素を削除します。

ただし、このメソッドはprotectedとして定義されているため、ArrayListクラスを継承したクラスからしか呼び出せません。使用する際は、以下の手順に従います。

  • extendsキーワードを使って、自作クラスでArrayListクラスを継承する。

  • その自作クラスをインスタンス化する。

  • 生成したオブジェクトに要素を追加する。

  • removeRange()メソッドを呼び出し、削除したい範囲のインデックスを指定して部分リストを削除する。

サンプルコード

import java.util.ArrayList;
public class RemovingSubList extends ArrayList<String>{
    public static void main(String[] args){
        // 自作クラス(ArrayListのサブクラス)のインスタンス化
        RemovingSubList list = new RemovingSubList();
        list.add("JavaFX");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        list.add("OpenNLP");
        list.add("JOGL");
        list.add("Hadoop");
        list.add("HBase");
        list.add("Flume");
        list.add("Mahout");
        list.add("Impala");
        System.out.println("ArrayListの内容: \n"+list);
        // インデックス4〜8の部分リストを削除
        list.removeRange(4, 9);
        System.out.println("部分リスト削除後のArrayListの内容: \n"+list);
    }
}

実行結果

ArrayListの内容:
[JavaFX, Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala]
部分リスト削除後のArrayListの内容:
[JavaFX, Java, WebGL, OpenCV, Mahout, Impala]

使い分けのポイント

特別な理由がない限り、継承が不要で簡潔に書けるsubList().clear()の方法をおすすめします。removeRange()はprotectedメソッドのため、ArrayListを継承した専用クラスを用意する必要があり、コードが冗長になりがちです。なお、ArrayListの場合、subList()で取得したビューに対するclear()は内部的に効率的な一括削除を行うため、パフォーマンスを気にせず安心して利用できます。

  1. 【初心者向け】Pythonでリストから要素を削除する4つの方法|pop()・remove()・del・clear()の使い方

    Pythonのリスト(list)は線形データ構造の一つで、要素が連続したメモリ領域に格納され、各要素にはインデックスを使ってアクセスできます。 プログラミングをしていると、リストから特定の要素を削除したい場面によく出会います。Pythonにはそのための組み込み機能がいくつか用意されており、目的に応じて使い分けることが大切です。この記事では、代表的な4つの方法「pop()」「remove()」「del」「clear()」をコード例とともに解説します。 1. pop():インデックスを指定して削除する pop() は、引数として渡したインデックス位置にある要素を削除します。さらに、削除された要素を

  2. JavaでArrayListから重複要素を削除する方法【SetとStream API】

    この記事では、JavaのArrayListから重複する要素を削除する方法を、具体的なコード例とともにわかりやすく解説します。代表的な2つのアプローチを紹介するので、目的や使用しているJavaのバージョンに応じて使い分けてください。 ArrayListから重複する文字列を削除する Setインターフェースには「重複した要素を保持できない」という特性があります。この特性を利用して、重複を含むArrayListを引数としてSetオブジェクトを生成すれば、手軽に重複を除去できます。 ポイントはLinkedHashSetを使うことです。通常のHashSetではなくLinkedHashSetを採用することで