subList() メソッドとは何ですか?
コレクション フレームワークは、Java API で非常に人気のあるコンポーネントです。List インターフェイスと ArrayList クラスは、おそらくコレクション フレームワークで最も重要なツールです。subListは、既存のリストの一部から新しいリストを作成できる List インターフェイスのメソッドです。ただし、この新しく作成されたリストは、元のリストへの参照を持つビューにすぎません。
ArrayList オブジェクトの subList メソッドの例。
国の ArrayList を宣言しています。次に、2 番目と 4 番目の要素の間の部分を返そうとします。import java.util.*;
public class Main {
public static void main(String[] args) {
// create an ArrayList
ArrayList list = new ArrayList();
// add values to ArrayList
list.add("USA");
list.add("UK");
list.add("France");
list.add("Germany");
list.add("Russia");
System.out.println("List of the countries:" + list);
//Return the subList : 1 inclusive and 3 exclusive
ArrayList new_list = new ArrayList(list.subList(1, 3));
System.out.println("The subList of the list: "+new_list);
}
}
上記のコードの出力は次のようになります
国のリスト:[アメリカ、イギリス、フランス、ドイツ、ロシア] リストのサブリスト:[イギリス、フランス]
ArrayList では、最初の要素のインデックス値は 0 です。したがって、2 番目と 4 番目の要素のインデックス値はそれぞれ 1 と 3 になります。したがって、 sublist()メソッドをlist.subList(1, 3)として呼び出します。ただし、この場合、subList メソッドは 4 番目の要素(「ドイツ」)である toIndex を除いた部分を返すことに注意してください。したがって、 「UK」と「France」のみが出力されます。返される出力は List 自体であるため、その出力に対して任意の List メソッドを直接呼び出すことができます。では、両方のパラメーターに同じインデックスを使用するとどうなるでしょうか? そのインデックスは返されるリストに含まれますか、それとも除外されますか? 確認してみましょう。
//execute subList() method with the same argument for both parameters.
ArrayList new_list2 = new ArrayList(list.subList(3, 3));
System.out.println("The subList of the list: "+new_list2);
出力は
リストの subList: [ ]
出力は空のリストです。fromIndex が 4 番目の要素を選択しても、それは toIndex でもあるため、 subList()メソッドによって削除されます。
LinkedList オブジェクトの subList メソッドの例。
この例では、LinkedList 要素で sublist メソッドを使用します。繰り返しますが、指定されたインデックスfromIndex(inclusive)とtoIndex(exclusive)の間のリストが返されます。subList()メソッドによって返されるリストは、元のリストへの参照を持つ単なるビューであると述べたことを思い出してください。サブリストに変更を加えると、元のリストにも影響します。この例でもそれをテストします。import java.util.LinkedList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Create a LinkedList
LinkedList linkedlist = new LinkedList();
// Add elements to LinkedList
for(int i = 0; i<7; i++){
linkedlist.add("Node "+ (i+1));
}
// Displaying LinkedList elements
System.out.println("Elements of the LinkedList:");
Iterator it= linkedlist.iterator();
while(it.hasNext()){
System.out.print(it.next()+ " ");
}
// invoke subList() method on the linkedList
List sublist = linkedlist.subList(2,5);
// Displaying SubList elements
System.out.println("\nElements of the sublist:");
Iterator subit= sublist.iterator();
while(subit.hasNext()){
System.out.print(subit.next()+" ");
}
/* The changes you made to the sublist will affect the original LinkedList
* Let’s take this example - We
* will remove the element "Node 4" from the sublist.
* Then we will print the original LinkedList.
* Node 4 will not be in the original LinkedList too.
*/
sublist.remove("Node 4");
System.out.println("\nElements of the LinkedList LinkedList After removing Node 4:");
Iterator it2= linkedlist.iterator();
while(it2.hasNext()){
System.out.print(it2.next()+" ");
}
}
}
出力は次のようになります。
LinkedList の要素: ノード 1 ノード 2 ノード 3 ノード 4 ノード 5 ノード 6 ノード 7 サブリストの要素: ノード 3 ノード 4 ノード 5 LinkedList の要素 LinkedList ノード 4 の削除後: ノード 1 ノード 2 ノード 3 ノード 5 ノード 6ノード7
subList() でインデックスが範囲外の場合はどうなりますか?
subListメソッドは 2 種類の例外を返します。それらを見てみましょう。指定されたインデックスが List 要素の範囲外である場合(fromIndex < 0 || toIndex > size)の状況を考えてみましょう。次に、 IndexOutOfBoundExecptionをスローします。//using subList() method with fromIndex <0
ArrayList new_list2 = new ArrayList(list.subList(-1, 3));
System.out.println("Portion of the list: "+new_list2);
Exception in thread "main" java.lang.IndexOutOfBoundsException: fromIndex = -1
// using subList() method with toIndex > size
ArrayList new_list2 = new ArrayList(list.subList(3, 6));
System.out.println("Portion of the list: "+new_list2);
Exception in thread "main" java.lang.IndexOutOfBoundsException: toIndex = 6
また、 fromIndex が toIndex より大きい場合(fromIndex > toIndex)、subList()メソッドはIllegalArgumentExceptionエラーをスローします。
//If fromIndex > toIndex
ArrayList new_list2 = new ArrayList(list.subList(5, 3));
System.out.println("Portion of the list: "+new_list2);
Exception in thread "main" java.lang.IllegalArgumentException: fromIndex(5) > toIndex(3)
結論
この記事では、 subListメソッドとその使用方法について説明しました。subList()メソッドを使用すると、明示的な範囲操作の必要がなくなります (配列に対して一般的に存在する操作のタイプです)。覚えておくべき最も重要なことは、subList メソッドは新しいインスタンスを返すのではなく、元のリストへの参照を含むビューを返すということです。したがって、同じリストでsubListメソッドを過度に使用すると、Java アプリケーションでスレッドがスタックする可能性があります。
さらに読む: |
---|
GO TO FULL VERSION