ホームページ  >  記事  >  Java  >  Javaで配列をスライスする方法にはどのようなものがありますか?

Javaで配列をスライスする方法にはどのようなものがありますか?

王林
王林転載
2023-05-20 18:22:193098ブラウズ

1. 質問

配列スライスは、指定された配列の部分配列を取得する方法です。 a[] が配列であると仮定します。 8 つの要素があり、a[0] から a[7]

int a[] = {8, 9, 4, 6, 0, 11, 45, 21}

a[3] から a[6] までの範囲の配列インデックスのサブセットを見つける必要があります。 startIndex は a[3] に対応し、endIndex は a[6] に対応します。したがって、次のスライスが得られます。

a[] = {6, 0, 11, 45}

配列のスライスを見つける方法は 3 つあります。

  1. 要素のコピーによる

  2. copyOfRange() メソッドの使用による

  3. Java 8 ストリームの使用

2. メソッド

1) 要素をコピーすることによって

  • まず、要素の開始インデックスと終了インデックスを見つけます。与えられた配列。

  • その後、サイズ (endIndex - startIndex) の空の配列 (スライス配列) を作成します。

  • 指定された配列から、要素 (startIndex から) をスライス配列にコピーします。最後に、スライス配列を出力します。

public class Test {
    public static void main(String[] args) {
        int[] array = {0,1,2,3,4,5,6,7,8,9};
        int startIndex = 3, endIndex = 8;
        int[] slicedArray = getSlice(array, startIndex, endIndex + 1);
        System.out.println("Slice of Array: "+ Arrays.toString(slicedArray));
    }
    public static int[] getSlice(int[] array, int startIndex, int endIndex)
    {
        int[] slicedArray = new int[endIndex - startIndex];
        //将数组元素从原始数组复制到新创建的切片数组
        for (int i = 0; i < slicedArray.length; i++)
        {
            slicedArray[i] = array[startIndex + i];
        }
        return slicedArray;
    }
}

結果は次のとおりです:

Slice of Array: [3, 4, 5, 6, 7, 8]

2) copyOfRange() メソッドを使用する場合

  • copyOfRange() メソッドは Java Arrays クラスに属します。

  • 配列の指定された範囲を 新しく作成された配列 (スライス配列) にコピーし、元の配列から指定された範囲を含む新しく作成された配列を返します。

  • 配列スライスの作成には O(n) 時間がかかり、要素の保存には O(n) スペースが必要です。n は結果の配列内の要素の数です。 。

public static int[] copyOfRange(int[] original, int from, int to)

次の例外がスローされます:

  • ArrayIndexOutOfBoundsException: from が 0 より小さいか、from がより大きい場合指定された配列の長さ。

  • IllegalArgumentException: 引数 from が to より大きい場合。

  • NullPointerException: 指定された配列が空の場合。

public class Test {
    public static void main(String[] args) {
        int[] array = {0,1,2,3,4,5,6,7,8,9};
        int startIndex = 3, endIndex = 8;
        int[] slicedArray = getSlice(array, startIndex, endIndex + 1);
        System.out.println("Slice of Array: "+ Arrays.toString(slicedArray));
    }
    public static int[] getSlice(int[] array, int startIndex, int endIndex)
    {
        int[] slicedArray = Arrays.copyOfRange(array, startIndex, endIndex);
        return slicedArray;
    }
}

結果は次のとおりです:

Slice of Array: [3, 4, 5, 6, 7, 8]

3) Java 8 Streams の使用

次の手順を使用します

  • Java 8 Stream を使用して配列のスライスを見つけることができます。

  • まず、startIndex 配列と endIndex 配列を見つけます。

  • range() メソッドを使用して、(範囲内の) 要素を元のストリームに変換します。

  • map() メソッドを使用して、指定された配列内の指定された要素をマップします。

  • toArray() メソッドを呼び出して、マップされた配列を配列に変換します。スライスを印刷します

public class Test {
    public static void main(String[] args) {
        int[] array = {0,1,2,3,4,5,6,7,8,9};
        int startIndex = 3, endIndex = 8;
        int[] slicedArray = getSlice(array, startIndex, endIndex + 1);
        System.out.println("Slice of Array: "+ Arrays.toString(slicedArray));
    }
    public static int[] getSlice(int[] array, int startIndex, int endIndex)
    {
        //获取数组的切片并将其存储在数组 slcarray[] 中
        // range() 方法将元素转换为流
        // 使用 lambda 表达式获取 int 流的元素
        // 使用 toArray() 方法将映射元素转换为切片数组
        int[] slcarray = IntStream.range(startIndex, endIndex).map(i -> array[i]).toArray();
        return slcarray;
    }
}

結果は次のようになります:

Slice of Array: [3, 4, 5, 6, 7, 8]

以上がJavaで配列をスライスする方法にはどのようなものがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。