スライドショー

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

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

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

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

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

この記事では、

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

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

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

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

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

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メソッドで文字列を切り出す方法を解説しています。

【Java入門】substringで文字列を切り出し抽出する方法
更新日 : 2019年5月10日

Listの使い方総まとめ

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

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

まとめ

いかがでしたか?

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

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

LINEで送る
Pocket

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



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

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

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

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

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

書いた人

中沢 丈

中沢 丈

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
[email protected]

おすすめコンテンツ

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

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