こんにちは!エンジニアの中沢です。
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]
元のListとsubListの値が共有されていることが確認できました!
subListはシャローコピーなので注意が必要
subListは元のListと同じデータを参照しています。
これをシャローコピーといいます。
また、次のようにインデックスの範囲が0の場合は空のListができるので注意してください。
List<Integer> sbList = mainList.subList(1, 1);
Listの範囲を指定して一括削除をする方法
ここではsubListを使って、インデックスの範囲を指定して一括削除する方法を解説します。
まずはListを作成します。
次にsubListとclearメソッドで削除します。
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の操作を忘れてしまったらこの記事を確認してくださいね!