Wie erstelle ich ein Sub-Array aus einem anderen Array in Java?

284

Wie erstelle ich ein Sub-Array aus einem anderen Array? Gibt es eine Methode, die die Indizes aus dem ersten Array übernimmt, wie z.

methodName(object array, int start, int end)

Ich möchte nicht darüber hinweggehen, Schleifen zu machen und mein Programm leiden zu lassen.

Ich bekomme immer wieder Fehler:

Symbolmethode copyOfRange (int [], int, int) kann nicht gefunden werden

Das ist mein Code:

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);
    }
}
Dazugewinnen
quelle

Antworten:

305

Sie können verwenden

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

Jigar Joshi
quelle
3
Ich hatte einige Probleme damit, dass Object [] nicht in meiner Arrays.copyOfRange enthalten war. Überprüfen Sie Ihre Importe, um sicherzustellen, dass Sie java.util.Arrays verwenden. Irgendwie wurde eine andere Arrays-Version importiert und ich habe 15 Minuten damit verbracht, JREs und JDKs auf das Problem zu überprüfen.
NuclearPeon
@ NuclearPeon Danke !!! Ich hätte lange gebraucht, bis ich es selbst herausgefunden hätte. Eclipse wird automatisch importiert org.bouncycastle.util.Arrays.
Anddero
136

Arrays.copyOfRange(..)wurde in Java 1.6 hinzugefügt. Vielleicht haben Sie nicht die neueste Version. Wenn ein Upgrade nicht möglich ist, schauen Sie sich anSystem.arraycopy(..)

Bozho
quelle
1
@Sami entweder Upgrade auf 1.6 oder siehe dieses Dokument als Referenz download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi
4
Von welchem ​​Anbieter stammt Ihr JDK? Sun / Oracle hat nie eine Version 4.00.28 veröffentlicht und Google konnte sie auch nicht finden.
Peter Lawrey
copyOfRange setzt nachfolgende Elemente auf Null, wenn sie außerhalb des Quell-Array-Bereichs liegen, anstatt ein kleineres Array
zuzuweisen
12
jemand sollte in der Antwort hinzufügen, dass "Startindex" inklusive ist, "Endindex" exklusiv ist
Yan King Yin
@YanKingYin Sie sind richtig - genau das habe ich die Kommentare gelesen :)
Ben Kushigian
43

Verwenden Sie die copyOfRange-Methode aus der Klasse java.util.Arrays:

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

Für mehr Details:

Link zu ähnlicher Frage

Dhirendra Pratap
quelle
20

Ja, es heißt System.arraycopy (Object, int, Object, int, int) .

Es wird jedoch immer noch irgendwo eine Schleife ausgeführt, es sei denn, dies kann in etwa REP STOSWdurch die JIT optimiert werden (in diesem Fall befindet sich die Schleife innerhalb der CPU).

int[] src = new int[] {1, 2, 3, 4, 5};
int[] dst = new int[3];

System.arraycopy(src, 1, dst, 0, 3); // Copies 2, 3, 4 into dst
Gerco trocknet
quelle
7

Mit Apache ArrayUtils, das unter diesem Link heruntergeladen werden kann, können Sie die Methode einfach verwenden

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 

"boolean" ist nur ein Beispiel, es gibt Methoden für alle primitiven Java-Typen

Alessandro Muzzi
quelle
6

JDK> = 1,8

Ich stimme allen obigen Antworten zu. Es gibt auch einen guten Weg mit Java 8 Streams:

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

Dies hat den Vorteil, dass es für viele verschiedene Arten von "src" -Arrays nützlich sein kann und dazu beiträgt, das Schreiben von Pipeline-Operationen im Stream zu verbessern.

Nicht speziell zu dieser Frage, aber zum Beispiel, wenn das Quell-Array war double[]und wir average()das Sub-Array nehmen wollten :

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();
Enator
quelle
3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);
Milan Jaros
quelle
2

Der Code ist korrekt, ich vermute also, dass Sie ein älteres JDK verwenden. Das Javadoc für diese Methode sagt, dass es seit 1.6 dort ist. Geben Sie in der Befehlszeile Folgendes ein:

java -version

Ich vermute, dass Sie nicht 1.6 ausführen

Merky
quelle
1

Wenn Sie Java vor Version 1.6 verwenden, verwenden Sie es System.arraycopy()stattdessen. Oder aktualisieren Sie Ihre Umgebung.

AlexR
quelle