【Java】subListを使ってリスト(List)から部分リストを作成する!
リスト(List)から部分リストを作成するにはListクラスのsubListメソッドを使用します。
subListメソッドは、指定されたインデックスとインデックスの間のリストの一部を取得するために使用されます。
開始インデックスと終了インデックスが等しい場合、返されるリストは空となります。
例えば、処理を記述していく中で、リスト全体のデータがは必要ないけど、その一部だけ必要であるというようなケースがあります。
そのような場合にsubListメソッド使って必要なデータのみを取り出すことができます。
今回はListクラスのsubListメソッドを使って以下の場合でリスト(List)から部分リストを作成していきます。
・ 開始位置と終了位置を指定してリストを作成する場合
・ 開始位置と終了位置が同じ状態でリストを作成する場合
目次
subListメソッドとは
ListクラスのsubListメソッドとはもとのListから取り出したい範囲を指定してサブリストとしてリストの一部を取得します。
そのため、リストから部分リストを作成することができます。
subListメソッドの書き方
subListメソッドの構文は下記となります。
1 |
List.sublist(開始インデックス, 終了インデックス) |
パラメータ
・ 開始インデックス:
要素が抽出される開始位置(スタートは0から)
・ 終了インデックス:
要素が抽出されるまでの終了位置(このインデックスは含まない)
開始インデックスと終了インデックスが等しい場合、返されるリストは空になります。
リスト(List)から部分リストを作成するサンプルコード
リスト(List)から部分リストを作成するサンプルコードを紹介します。
開始位置と終了位置を指定してリストを作成する場合
開始位置と終了位置を指定してリスト(List)から部分リストを作成します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws Exception { List<String> list1 = new ArrayList<String>(); // リストに要素を追加 list1.add("あいうえお"); list1.add("かきくけこ"); list1.add("さしすせそ"); list1.add("なにぬねの"); //サブリストの取得 List<String> sublist1 = list1.subList(1, 3); //リスト、サブリストの表示 System.out.println(list1); System.out.println(sublist1); } } |
出力結果
[あいうえお, かきくけこ, さしすせそ, なにぬねの]
[かきくけこ, さしすせそ]
開始位置と終了位置を指定することで、部分リストを作成することができます。
開始位置と終了位置が同じ状態でリストを作成する場合
開始位置と終了位置を同じにしてリスト(List)から部分リストを作成します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws Exception { List<String> list2 = new ArrayList<String>(); // リストに要素を追加 list2.add("あいうえお"); list2.add("かきくけこ"); list2.add("さしすせそ"); list2.add("なにぬねの"); //サブリストの取得 List<String> sublist2 = list2.subList(1, 1); //リスト、サブリストの表示 System.out.println(list2); System.out.println(sublist2); } } |
出力結果
[あいうえお, かきくけこ, さしすせそ, なにぬねの]
[]
開始位置と終了位置を同じにすると空が返ってきます。
subListメソッドで注意すること
subListメソッドは、元のリストも、subListメソッドで取り出した部分リストも、データとしては同じものを参照しています。
その為、取り出した部分リストを変更したり、元のリストを変更したりすると、変更がどちらにも反映されてしまいます。
そのため、取り出した部分リストを変更した場合と元のリストを変更した場合のサンプルコードを紹介します。
部分リストの作成後に部分リストを操作する場合
部分リストを作成した後に部分リストに要素を追加してリストと部分リストを表示してみます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// リストから部分リストを作成する import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws Exception { List<String> list3 = new ArrayList<String>(); // リストに要素を追加 list3.add("あいうえお"); list3.add("かきくけこ"); list3.add("さしすせそ"); list3.add("なにぬねの"); //サブリストの取得 List<String> sublist3 = list3.subList(1, 3); //リスト、サブリストの表示 System.out.println(list3); System.out.println(sublist3); //サブリストに対する操作 sublist3.add("たちつてと"); //リスト、サブリストの表示 System.out.println(list3); System.out.println(sublist3); } } |
出力結果
[あいうえお, かきくけこ, さしすせそ, なにぬねの]
[かきくけこ, さしすせそ]
[あいうえお, かきくけこ, さしすせそ, たちつてと, なにぬねの]
[かきくけこ, さしすせそ, たちつてと]
部分リストを操作すると元のリスト側にも影響を受けるようになります。
部分リストの作成後に元のリストを操作する場合
部分リストを作成した後に元のリストに要素を追加して、リストと部分リストを表示してみます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// リストから部分リストを作成する import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws Exception { List<String> list4 = new ArrayList<String>(); // リストに要素を追加 list4.add("あいうえお"); list4.add("かきくけこ"); list4.add("さしすせそ"); list4.add("なにぬねの"); //サブリストの取得 List<String> sublist4 = list4.subList(1, 3); //リスト、サブリストの表示 System.out.println(list4); System.out.println(sublist4); //リストに対する操作 list4.add("たちつてと"); //リスト、サブリストの表示 System.out.println(list4); System.out.println(sublist4); } } |
出力結果
Exception in thread “main” java.util.ConcurrentModificationException
元のリストを操作した後に、部分リストを参照するとエラーになります。
今回のポイント
subListで部分リストを作成
リストから部分リストを作成するにはListクラスのsubListメソッドを使用する
• ListクラスのsubListメソッドでリストから部分リストを作成
• subListメソッドの第1パラメータは部分リストを作成する開始インデックスの要素、第2パラメータは部分リストを作成する終了インデックスの要素-1番目の要素までを含む部分リストを返す
• 部分リストは新しく作られたものではなく、既存のリストの一部分のみを扱うため、部分リストに対する操作は、元のリストにも影響を与える
• 元のリストに要素を追加した後、部分リストを参照すると「ConcurrentModificationException」例外が発生する
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。