【Java入門】ListをsubListで切り出して新しいListを作る方法

こんにちは!エンジニアの中沢です。

JavaでListから必要な範囲だけを取得して新しいListを作りたいと思ったことはありませんか?

Listから範囲を指定して新しいListを作るには、subListメソッドを使います。

今回は、subListメソッドでListから必要な範囲を切り出す方法解説します!

この記事では、

・Listから必要な範囲だけを取得して新しいListを作りたい
・subListメソッドの使い方を知りたい

という基本的な内容から、

・リストの範囲を指定して、一括削除をしたい
・subListの値を変えると元のListの値も変わるの?

などの応用的な使い方に関しても解説していきます。

今回はこれらの方法を覚えるために、subListメソッドの使い方をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

subListとは

サイズの大きなListの一部分だけが必要なときに、その必要な一部分だけを切り出して新しいListを作りたいときにはどうしたらいいでしょうか?

Listから一部を切り出して、新しいListを作りたいときにはsubListメソッドを使います。

subListメソッドの引数でListの範囲を指定して切り出すことができます!

subListの使い方

Listから範囲を切り出してsubListを作る方法

まずは元のListから必要な範囲だけを取得して新しいsubListを作る方法です!

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

public class Main {

	public static void main(String[] args) {

		List mainList = new ArrayList<>();
		mainList.add(0);
		mainList.add(1);
		mainList.add(2);
		mainList.add(3);
		mainList.add(4);

		List sbList = mainList.subList(1, 3);

		System.out.println("元のList = " + mainList);
		System.out.println("subList = " + sbList);
	}
}

これでsubListを作ることができました。
さっそく実行結果を見てみましょう!

[実行結果]

元のList = [0, 1, 2, 3, 4]
subList = [1, 2]

元のListの中身は[0, 1, 2, 3, 4]です。
これは大丈夫ですね!

次にsubListの中身ですが、インデックスの終わりを含まないことに気をつけましょう。

ここでは(1, 3)指定したので[1, 2]が出力されます。

subListの値を変えると元のListの値も変わる

subList元のList値を共有しています。

そのため、subListの値を変更すると元のListの値も変わります。

さきほどのコードに続いて、次のようにsubListの値を変更したときにどうなるのか見てみましょう。

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

public class Main {

	public static void main(String[] args) {

		List mainList = new ArrayList<>();
		mainList.add(0);
		mainList.add(1);
		mainList.add(2);
		mainList.add(3);
		mainList.add(4);

		List sbList = mainList.subList(1, 3);
		sbList.set(0, 101);

		System.out.println("元のList = " + mainList);
		System.out.println("subList = " + sbList);
	}
}

[実行結果]

元のList = [0, 101, 2, 3, 4]
subList = [101, 2]

subListで変更した値が元のListにも反映されていることが確認できます。

元のListの値を変えるとsubListの値も変わる

次は元のListの値を変えた場合です。

この場合もsubListの値が変わります。

さきほどのコードに続いて、次のように元のListの値を変更します。

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

public class Main {

	public static void main(String[] args) {

		List mainList = new ArrayList<>();
		mainList.add(0);
		mainList.add(1);
		mainList.add(2);
		mainList.add(3);
		mainList.add(4);

		List sbList = mainList.subList(1, 3);
		sbList.set(0, 101);
		mainList.set(2, 102);

		System.out.println("元のList = " + mainList);
		System.out.println("subList = " + sbList);
	}
}

[実行結果]

元のList = [0, 101, 102, 3, 4]
subList = [101, 102]

元のListsubListの値が共有されていることが確認できました!

subListはシャローコピーなので注意が必要

subList元のList同じデータを参照しています。

これをシャローコピーといいます。

また、次のようにインデックスの範囲が0の場合は空のListができるので注意してください。

List<Integer> sbList = mainList.subList(1, 1);

Listの範囲を指定して一括削除をする方法

ここではsubListを使って、インデックスの範囲を指定して一括削除する方法を解説します。

まずはListを作成します。

次にsubListclearメソッドで削除します。

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

public class Main {

	public static void main(String[] args) {

		List mainList = new ArrayList();

		mainList.add(0);
		mainList.add(1);
		mainList.add(2);
		mainList.add(3);
		mainList.add(4);

		System.out.println("元のList = " + mainList);

		mainList.subList(1, 3).clear();
		System.out.println("元のList = " + mainList);
	}
}

[実行結果]

元のList = [0, 1, 2, 3, 4]
元のList = [0, 3, 4]

これで次の実行結果のようにsubListで指定した範囲の要素が削除されました。

このようにsubListで指定した範囲をclearメソッドで削除することで、範囲を指定した一括削除ができるようになります。

subListを利用することで発生する例外

リストの要素数を超えるインデックスを指定した場合にはIndexOutOfBoundsExceptionの例外が発生します。

事前にsizeメソッドなどで要素数を確認して例外が発生しないようにしましょう。

文字列を切り出す場合はsubstringを使う

Listの切り出しにはsubListメソッドを使いましたが、文字列の切り出しにはsubstringメソッドを使います。

こちらの記事では、substringメソッドで文字列を切り出す方法を解説しています。

Listの使い方総まとめ

この記事では紹介しきれなかったListの様々な使い方をこちらの記事で解説しているので、ぜひ確認してみてください!

まとめ

いかがでしたか?

今回はsubListを使って、Listの範囲を指定して操作する方法について解説しました。
Listの範囲を指定して一括削除をする方法は便利なのでぜひ覚えてください!

もしsubListを使ったListの操作を忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次