HOWTO · Java

Slicen ein Array in Java

Dieser Artikel hilft Ihnen dabei, ein Array mit Hilfe von Java in ein Subarray zu zerlegen.

Auf dieser Seite

Um ein Java-Array zuzuschneiden, kopieren Sie die Elemente eines zusammenhängenden Bereichs in ein neues Array. Die folgenden Beispiele verwenden einen inklusiven Start- und einen exklusiven Endindex: fromIndex ist enthalten, toIndex ist der erste nicht mehr enthaltene Index. Der Bereich [2, 5) umfasst beispielsweise die Indizes 2, 3 und 4. Das ursprüngliche Array bleibt unverändert.

Ein Array in Java durch Duplizieren von Elementen zuschneiden

Eine Schleife macht die Zuordnung der Indizes deutlich. Legen Sie das Ergebnisarray mit der Länge toIndex - fromIndex an und kopieren Sie anschließend jeden ausgewählten Wert an die entsprechende Position im Ergebnis.

Dieses vollständige Programm wählt die Indizes 1 bis 3 aus einem Integer-Array aus:

import java.util.Arrays;

public class ArraySliceLoop {
    static int[] slice(int[] values, int fromIndex, int toIndex) {
        int[] result = new int[toIndex - fromIndex];
        for (int i = 0; i < result.length; i++) {
            result[i] = values[fromIndex + i];
        }
        return result;
    }

    public static void main(String[] args) {
        int[] values = {10, 20, 30, 40, 50};
        int[] part = slice(values, 1, 4);
        System.out.println(Arrays.toString(part));
    }
}

Das Ergebnis ist ein eigenes Array. Der Schleifenzähler i beginnt für das Ergebnis bei null, während fromIndex + i das passende Element im Quellarray bezeichnet. Rufen Sie die Methode mit Indizes auf, die einen gültigen Bereich innerhalb des Quellarrays beschreiben.

Ein Array in Java mit der Methode copyOfRange() zuschneiden

Arrays.copyOfRange() bietet eine direkte Möglichkeit, aus einem Bereich ein neues Array zu erstellen. Die Methode gehört zu java.util.Arrays; ihr Argument from ist inklusiv und ihr Argument to exklusiv. Der genaue API-Name enthält copyOfRange().

Dieses Programm kopiert die Indizes 1, 2 und 3:

import java.util.Arrays;

public class ArraySliceCopyOfRange {
    public static void main(String[] args) {
        int[] values = {10, 20, 30, 40, 50};
        int[] part = Arrays.copyOfRange(values, 1, 4);
        System.out.println(Arrays.toString(part));
    }
}

Das zurückgegebene Array enthält die ausgewählten Werte. Wenn Sie es ändern, werden dadurch keine Elemente im ursprünglichen Array ersetzt. Bei primitiven Arrays wie int[] werden die Werte kopiert. Bei Objektarrays ist das Array neu, seine Elemente verweisen jedoch auf dieselben Objekte.

Ein Array in Java mit einem Stream zuschneiden

Ein Stream kann Arraywerte auswählen, indem ein Stream von Indizes auf das Quellarray abgebildet wird. Betrachten Sie dies als optionalen Ansatz: Verwenden Sie ihn nur, wenn die für Ihr Projekt konfigurierte Java-Laufzeit die erforderlichen Stream-APIs unterstützt. Eine Laufzeitversion wird hier nicht vorausgesetzt.

Der Vorgang lässt sich als IntStream.range(fromIndex, toIndex).map(i -> values[i]).toArray() schreiben. IntStream.range verwendet einen inklusiven Start und ein exklusives Ende und folgt damit derselben Bereichskonvention wie die anderen Methoden. Dieser kompakte Ausdruck dient der Veranschaulichung. Prüfen Sie vor der Verwendung, ob die APIs in der für Ihr Projekt festgelegten Java-Laufzeit verfügbar sind. Wenn diese Laufzeit unbekannt ist, sind eine Schleife oder Arrays.copyOfRange() eine unkomplizierte Alternative.

Ein Array in Java mit der Methode System.arraycopy zuschneiden

System.arraycopy kopiert eine festgelegte Anzahl von Elementen aus einem Array in ein anderes. Erstellen Sie ein Zielarray mit der Länge toIndex - fromIndex und übergeben Sie dann die Quellposition, die Zielposition und die Anzahl der zu kopierenden Elemente.

import java.util.Arrays;

public class ArraySliceSystemArraycopy {
    public static void main(String[] args) {
        int[] values = {10, 20, 30, 40, 50};
        int fromIndex = 1;
        int toIndex = 4;
        int[] part = new int[toIndex - fromIndex];
        System.arraycopy(values, fromIndex, part, 0, part.length);
        System.out.println(Arrays.toString(part));
    }
}

Die Argumente sind das Quellarray, die Quellposition, das Zielarray, die Zielposition und die Anzahl der zu kopierenden Elemente. Hier ist die Zielposition null, sodass der ausgewählte Quellbereich part ab dessen erster Position füllt. Quell- und Zielarray müssen kompatible Elementtypen haben; außerdem müssen Positionen und Länge in beide Arrays passen.

Ein Array in Java mit asList und subList zuschneiden

Bei Arrays mit Referenztypen erstellt Arrays.asList() eine Liste fester Größe, die vom Array unterlegt wird. subList(fromIndex, toIndex) gibt eine Ansicht des ausgewählten Listenbereichs zurück. Wenn das Ergebnis ein eigenes Array sein soll, wandeln Sie diese Ansicht in ein Array um.

import java.util.Arrays;
import java.util.List;

public class ArraySliceSubList {
    public static void main(String[] args) {
        String[] values = {"red", "green", "blue", "gold"};
        List<String> list = Arrays.asList(values);
        List<String> selected = list.subList(1, 3);
        String[] part = selected.toArray(new String[0]);
        System.out.println(Arrays.toString(part));
    }
}

Die von Arrays.asList() zurückgegebene Liste hat eine feste Größe: Sie können ein Element ersetzen, aber keine Listeneinträge hinzufügen oder entfernen. Die Teilliste ist eine Ansicht, die an diese Liste gebunden ist. Ein Aufruf von toArray() erstellt ein eigenes Array, dessen Objektelemente jedoch weiterhin auf dieselben Objekte verweisen. Dieser Ansatz eignet sich für Arrays mit Referenztypen wie String[]; für primitive Arrays benötigen Sie eine Methode für primitive Arrays, etwa die oben gezeigte Schleife, copyOfRange() oder System.arraycopy.

Fazit

Verwenden Sie eine Schleife, wenn Sie die elementweise Kopie nachvollziehen oder anpassen möchten. Wählen Sie Arrays.copyOfRange() für eine direkte Arraykopie oder System.arraycopy, wenn Sie Zielposition und Kopierlänge festlegen möchten. Ein Stream ermöglicht die Auswahl anhand von Indizes, sofern die Java-Laufzeit des Projekts die erforderlichen APIs unterstützt. Bei Arrays mit Referenztypen liefern asList und subList eine Listenansicht; mit toArray() erhalten Sie daraus ein eigenes Ergebnisarray.