Javaで配列の一部のみを取得しますか?


275

Javaの整数の配列があります。その一部のみを使用したいと思います。Pythonでは、このarray [index:]のようなことができ、インデックスから配列を返します。これはJavaで可能です。

回答:


444

Javaの配列の長さは不変です。したがって、目的の部分を新しい配列としてコピーする必要があります。java.util.Arraysクラスのメソッドを
使用します。copyOfRange

int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);

startIndexは、コピーする範囲の初期インデックスです。
endIndexは、コピーされる範囲の最後のインデックスです。(このインデックスは配列の外にある場合があります)

例えば:

   //index   0   1   2   3   4
int[] arr = {10, 20, 30, 40, 50};
Arrays.copyOfRange(arr, 0, 2);          // returns {10, 20}
Arrays.copyOfRange(arr, 1, 4);          // returns {20, 30, 40}
Arrays.copyOfRange(arr, 2, arr.length); // returns {30, 40, 50} (length = 5)

サイズ制限があるようですが?これだけが機能しますArrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)。255の代わりに、実際の長さを取得したくない場合は、Integer.MAX_VALUEを使用できません
Aquarius Power

@AquariusPowerサイズ制限は配列サイズであり、255より大きくすることができendIndexます。最初の引数として渡される配列のサイズよりも大きい値を指定することはできません。あなたは完全なコピーをしたいのであれば、この配列および使用を参照する変数を作成するArrays.copyOfRange(var, 0, var.length)Arrays.copyOf(var, var.length)
エリアス

スタックトレースサブアレイ用のローカル変数を作成する必要がありますが、これが機能することがわかりました!!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
Aquarius Power

気をつけてArrayIndexOutOfBoundsException
エリアス2016年

1
別の問題があります。長さの文字列配列を500Kと250Kのサブ配列に分割する必要がある場合はどうでしょうか。これらの方法は受け付け65000で最大れてinteregr
ヴィシュヌDahatonde

31

配列をリストとしてラップし、そのサブリストを要求できます。

MyClass[] array = ...;
List<MyClass> subArray = Arrays.asList(array).subList(index, array.length);

22

はい、Arrays.copyOfRangeを使用できます

同じことを行います(コピーがあることに注意してください。最初の配列は変更しません)。


2
そうは言っても、明示的なコピーを作成したくない場合は、@ K-balloの回答で概説されているa Listとa を使用する必要がありsubListます。
Louis Wasserman

そのとおり。Javaには、最新の言語が提供する配列スライス機能がありません。
DenysSéguret12年

そのように言ったかどうかはわかりませんが...はい、Javaは配列スライシングを提供していません。(とはいえ、このアプローチにはいくつかの利点があります。メモリリークの可能性が減少し、余分なフィールドを回避することで配列のオーバーヘッドが減少します。など)
Louis Wasserman

はい、あなたは再び正しいです(そして私は炎の戦争を始めようとしませんでした;))。スライスするとGCが非常に複雑になります。また、Javaが文字列でオブジェクトベースの暗黙的なスライスを試みたとき、これが危険であることをより明白にしました
DenysSéguret12年

11

あなたが試すことができます:

System.arraycopy(sourceArray, 0, targetArray, 0, targetArray.length);// copies whole array

// copies elements 1 and 2 from sourceArray to targetArray
System.arraycopy(sourceArray, 1, targetArray, 0, 2); 

Systemのjavadocを参照してください。


3
これがArrays.copyOf()とArrays.copyOfRange()が実際に実装されている方法(境界チェックを除く)が気に入っていますが、System.arraycopyのデートにもかかわらず、わずかに高いオーバーヘッドのユーティリティメソッドラッパーが投票を積み上げています1995
デイブ、

1
一部の人にとっては「モダン」に見えないだけだと思います。
デイブ

私は古い学校に行くのが好きです。必要な機械だけで、光沢のあるベルとホイッスルはありません。Cでのmemcpyのような
StvnBrkdll

しかし、arrays.copyOfRange()を使用すると、読みやすさが向上し、バグの可能性が大幅に減少します。
フロリアンF

7

Java 1.6以降を使用Arrays.copyOfRangeしている場合は、を使用して配列の一部をコピーできます。javadocから:

指定された配列の指定された範囲を新しい配列にコピーします。範囲(from)の初期インデックスは、0〜の範囲になければなりませんoriginal.length。atの値original[from]は、コピーの最初の要素に配置されます(from == original.lengthまたはを除くfrom == to)。元の配列の後続の要素の値は、コピーの後続の要素に配置されます。範囲の最後のインデックス(toよりも大きくまたはそれに等しくなければならない)from、より大きくてもよく、original.lengthその場合には、falseインデックス以上に等しいコピーのすべての要素に配置されますoriginal.length - from。返される配列の長さはになりますto - from

以下に簡単な例を示します。

/**
 * @Program that Copies the specified range of the specified array into a new 
 * array.
 * CopyofRange8Array.java 
 * Author:-RoseIndia Team
 * Date:-15-May-2008
 */
import java.util.*;
public class CopyofRange8Array {
    public static void main(String[] args) {
       //creating a short array
       Object T[]={"Rose","India","Net","Limited","Rohini"};
        // //Copies the specified  short array upto specified range,
        Object T1[] = Arrays.copyOfRange(T, 1,5);
        for (int i = 0; i < T1.length; i++) 
            //Displaying the Copied short array upto specified range
            System.out.println(T1[i]);
    }

}



-2

subList(int fromIndex, int toIndex)次のような整数arrでmethodを使用できます。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> arr = new ArrayList<>();
        arr.add(1);
        arr.add(2);
        arr.add(3);
        arr.add(4);
        List<Integer> partialArr = arr.subList(1, 3);

        // print the subArr
        for (Integer i: partialArr)
            System.out.println(i + " ");
    }
}

出力は次のようになります2 3

subList(int fromIndex, int toIndex)メソッドが受け取る2番目の変数(var2-1)でマイナス1を実行していることに注意してください。理由は正確にはわかりませんが、これは、配列のサイズを超える可能性を減らすためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.