CodeGym /Java Blog /ランダム /Java の Sublist() メソッド: ArrayList と List
John Squirrels
レベル 41
San Francisco

Java の Sublist() メソッド: ArrayList と List

ランダム グループに公開済み

subList() メソッドとは何ですか?

コレクション フレームワークは、Java API で非常に人気のあるコンポーネントです。List インターフェイスと ArrayList クラスは、おそらくコレクション フレームワークで最も重要なツールです。subListは、既存のリストの一部から新しいリストを作成できる List インターフェイスのメソッドです。ただし、この新しく作成されたリストは、元のリストへの参照を持つビューにすぎません。Java の Sublist() メソッド: ArrayList と List - 1たとえば、[1,2,3,4,5,6] のリストを考えてみましょう。最初と最後の要素を含まない新しいリストを作成するとします。このようなシナリオでは、list.subList()メソッドが役に立ちます。subList(fromIndex, toIndex)メソッドには形式が 1 つだけあり、最初のインデックス(fromIndex)と最後のインデックスの 2 つの引数を取ります。(インデックスへ)fromIndextoIndexの間の部分を新しいリストとして返します覚えておくべき重要な点があります。新しく作成されたリストには fromIndex が含まれ、toIndex は除外されます。したがって、上記のシナリオのアルゴリズムは次のようになります。List = [1,2,3,4,5,6] newList = List.subList(1,5) subList はList インターフェースのメソッドなので、ArrayList、LinkedList、Stack、Vector オブジェクトで使用できます。ただし、この記事では主に ArrayList オブジェクトと LinkedList オブジェクトに焦点を当てます。

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 アプリケーションでスレッドがスタックする可能性があります。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION