Javaで別の配列からサブ配列を作成するにはどうすればよいですか?


284

別の配列からサブ配列を作成する方法は?次のような最初の配列からインデックスを取得するメソッドはありますか?

methodName(object array, int start, int end)

ループを作成してプログラムを苦しめたくありません。

エラーが発生し続けます:

シンボルメソッドcopyOfRange(int []、int、int)が見つかりません

これは私のコードです:

import java.util.*;

public class testing 
{
    public static void main(String [] arg) 
    {   
        int[] src = new int[] {1, 2, 3, 4, 5}; 
        int b1[] = Arrays.copyOfRange(src, 0, 2);
    }
}

回答:


305

使用できます

JDK> 1.5

Arrays.copyOfRange(Object[] src, int from, int to)

Javadoc

JDK <= 1.5

System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 

Javadoc


3
Arrays.copyOfRangeにObject []がないという問題がありました。インポートをチェックして、java.util.Arraysを使用していることを確認してください。どういうわけか、別のバージョンのアレイがインポートされ、JREとJDKの問題をチェックするのに15分無駄になりました。
NuclearPeon 2013年

@NuclearPeonありがとうございます!!! 私がそれを自分で理解する前に、私には長い時間がかかっただろう。Eclipseが自動的にインポートされorg.bouncycastle.util.Arraysます。
アンデロ2017

136

Arrays.copyOfRange(..)Java 1.6で追加されました。おそらくあなたは最新バージョンを持っていません。アップグレードできない場合は、System.arraycopy(..)


1
@Samiどちらか1.6にアップグレードするか、参考のために、このドキュメントを参照してくださいdownload.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigarジョシ

4
JDKのベンダー。Sun / Oracleはバージョン4.00.28をリリースしたことがなく、googleもそれを見つけることができませんでした。
Peter Lawrey、2010

copyOfRangeは、より小さい配列を割り当てるのではなく、ソース配列の範囲外にある場合、後続の要素をnullにします:(
Daneel S. Yaitskov

12
「start-index」は包括的であるが、「end-index」は排他的
Yan King Yin

@YanKingYinあなたは正しいです-これはまさに私がコメントを読んでいたものです:)
Ben Kushigian '30




6

JDK> = 1.8

上記のすべての回答に同意します。Java 8 Streamsには、良い方法もあります。

int[] subArr = IntStream.range(startInclusive, endExclusive)
                        .map(i -> src[i])
                        .toArray();

これに関する利点は、さまざまなタイプの「src」配列に役立ち、ストリームでのパイプライン操作の書き込みを改善するのに役立ちます。

この質問に特別ではありませんが、たとえば、ソース配列がdouble[]ありaverage()、サブ配列を取得したい場合は、次のようになります。

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();


2

コードは正しいので、古いJDKを使用していると思います。そのメソッドのjavadocは、1.6以降に存在していると述べています。コマンドラインで次のように入力します。

java -version

あなたは1.6を実行していないと思います


1

バージョン1.6より前のJavaをSystem.arraycopy()代わりに使用しています。または、環境をアップグレードします。

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