362 Stimmen

Wie erstellt man in Java ein Sub-Array aus einem anderen Array?

Wie erstellt man ein Unter-Array aus einem anderen Array? Gibt es eine Methode, die die Indizes aus dem ersten Array nimmt, wie z.B.:

methodName(object array, int start, int end)

Ich möchte nicht zu viele Schleifen machen und mein Programm darunter leiden lassen.

Ich erhalte ständig eine Fehlermeldung:

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

Dies 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);
    }
}

395voto

jmj Punkte 232204

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

146voto

Bozho Punkte 570413

Arrays.copyOfRange(..) wurde in Java 1.6 hinzugefügt. Vielleicht haben Sie also nicht die neueste Version. Wenn es nicht möglich ist, ein Upgrade durchzuführen, schauen Sie unter System.arraycopy(..)

22voto

Gerco Dries Punkte 6590

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

Es wird immer noch irgendwo eine Schleife ausführen, es sei denn, dies kann in etwas wie optimiert werden REP STOSW durch das JIT (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

16voto

enator Punkte 2261

JDK >= 1.8

Ich stimme mit allen Antworten überein. Es gibt auch einen schönen Weg mit Java 8 Streams:

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

Der Vorteil dabei ist, dass es für viele verschiedene Arten von "src"-Arrays nützlich sein kann und hilft, die Schreib-Pipeline-Operationen auf dem Stream zu verbessern.

Ich bin bei dieser Frage nicht sicher, aber wenn das Quell-Array zum Beispiel double[] und wir wollten die average() des Unterarrays:

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

8voto

Alessandro Muzzi Punkte 734

Apache verwenden ArrayUtils herunterladbar unter ce lien können Sie einfach die Methode

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X