HOWTO · Java
Holen Sie sich die Teilmenge eines Arrays in Java
Dieses Tutorial zeigt, wie Sie eine Teilmenge eines Arrays in Java finden.
Auf dieser Seite
Um die ersten n Elemente eines Arrays zu kopieren, verwenden Sie eine Präfixoperation. Möchten Sie einen zusammenhängenden Teil an einer anderen Stelle des Arrays auswählen, geben Sie einen Startindex und einen exklusiven Endindex an. Java bietet dafür mehrere Möglichkeiten, die sich unter anderem hinsichtlich primitiver Arrays, Objekt-Arrays, Abhängigkeiten und der Verarbeitung mit Listen unterscheiden.
Die folgenden Beispiele enthalten die erforderlichen Imports und vollständige Programme. Für die sechs enthaltenen Java-Beispiele liegen erfolgreiche Ausführungsnachweise vor. Für den direkt im Text gezeigten Aufruf von Apache Commons Lang gibt es keinen Ausführungsnachweis. Bei allen Bereichsbeispielen ist der Startindex eingeschlossen und der Endindex ausgeschlossen.
Ein Array-Präfix mit Arrays.copyOf() abrufen
Arrays.copyOf() beginnt bei Index null und übernimmt die gewünschte Länge des Ergebnisarrays. Einen beliebigen Startindex kann die Methode nicht auswählen. Dieses Beispiel kopiert vier Zeichenfolgen. Es verwendet die Überladung mit zwei Argumenten, die den Typ des Quellarrays beibehält. Die Überladung mit einem dritten Argument vom Typ Class ist hilfreich, wenn sich der gewünschte Typ des Zielarrays unterscheidet.
Führen Sie dieses Beispiel aus. Die Bezeichnungen und Ausgaben im unveränderten Codebeispiel sind auf Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.util.Arrays;
public class ArrayPrefix {
public static void main(String[] args) {
String[] names = {"Ada", "Grace", "Linus", "Ken", "Margaret"};
String[] prefix = Arrays.copyOf(names, 4);
System.out.println(Arrays.toString(prefix));
}
}
Ist die angeforderte Länge größer als die Länge des Quellarrays, füllt copyOf das neue Array mit den Standardwerten des Komponententyps auf, zum Beispiel mit null bei einem Referenzarray und mit 0 bei einem int[]. Verwenden Sie diese Methode, wenn das gewünschte Ergebnis beim ersten Element beginnt.
Einen Arraybereich mit Arrays.copyOfRange() kopieren
Arrays.copyOfRange() kopiert die Elemente ab from bis zum Element vor to und gibt ein neues Array zurück. Weitere Informationen finden Sie in der Erklärung zu einem Bereich von Elementen aus dem ursprünglichen Array.
Die Bezeichnungen und Ausgaben im unveränderten Codebeispiel sind auf Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.util.Arrays;
public class ArrayRange {
public static void main(String[] args) {
int[] values = {10, 20, 30, 40, 50, 60};
int[] part = Arrays.copyOfRange(values, 2, 5);
System.out.println(Arrays.toString(part));
}
}
Die Indizes wählen 30, 40 und 50 aus. Ein Bereich, dessen Ende der Arraylänge entspricht, ist gültig. Sind Start und Ende gleich, entsteht ein leeres Array. Liegt to hinter dem Ende des Quellarrays, füllt die Methode den restlichen kopierten Bereich mit Standardwerten auf. Ein negativer Startindex, ein Startindex jenseits des Arrays oder ein Endindex vor dem Startindex ist ungültig. Verwenden Sie diese Methode für einfache Bereichskopien. Für ein Präfix setzen Sie from auf null.
Einen Arraybereich mit IntStream auswählen
IntStream gehört zu java.util.stream; laut der bereitgestellten Quelle setzt dieser Ansatz Java 8 oder höher voraus. Das ist die Mindestversion für diesen Ansatz und keine Aussage darüber, welche Laufzeit zum Ausführen des Artikels verwendet wurde. IntStream.range(start, end) erzeugt Indizes. mapToInt liest für jeden ausgewählten Index den entsprechenden Wert aus, bevor toArray() das Ergebnisarray erstellt.
Die Bezeichnungen und Ausgaben im unveränderten Codebeispiel sind auf Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.util.Arrays;
import java.util.stream.IntStream;
public class StreamRange {
public static void main(String[] args) {
int[] values = {10, 20, 30, 40, 50, 60};
int[] part = IntStream.range(2, 5).map(i -> values[i]).toArray();
System.out.println(Arrays.toString(part));
}
}
Die Indizes haben dieselbe Bedeutung wie bei copyOfRange: Der Start ist eingeschlossen, das Ende ausgeschlossen. Sind Start und Ende gleich, enthält die Auswahl keine Elemente. Dieses Muster eignet sich, wenn sich die Auswahl gut in eine Stream-Pipeline einfügt. Für eine einfache Kopie ist die Array-Hilfsmethode kürzer. Achten Sie darauf, nur Indizes innerhalb des Quellarrays auszuwählen, da die Mapping-Funktion direkt auf dieses Array zugreift.
Einen Arraybereich mit System.arraycopy() kopieren
System.arraycopy() kopiert eine angegebene Anzahl von Elementen zwischen Arrays. Der Quelloffset gibt das erste zu kopierende Element an; der Zieloffset bestimmt, an welcher Position es eingefügt wird. Legen Sie die Länge des Zielarrays auf die Länge des Bereichs, to - from, fest und verwenden Sie denselben Wert als Kopieranzahl.
Die Bezeichnungen und Ausgaben im unveränderten Codebeispiel sind auf Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.util.Arrays;
public class ArrayCopyRange {
public static void main(String[] args) {
char[] letters = {'a', 'b', 'c', 'd', 'e', 'f'};
int from = 2;
int to = 5;
int length = to - from;
char[] part = new char[length];
System.arraycopy(letters, from, part, 0, length);
System.out.println(Arrays.toString(part));
}
}
Da das Zielarray bei Index null beginnt, entsteht eine kompakte Bereichskopie. Sowohl der Quellbereich als auch die Kapazität des Zielarrays müssen für die angeforderte Anzahl von Elementen ausreichen. Diese Methode auf niedrigerer Ebene ist hilfreich, wenn Sie in ein vorhandenes Zielarray ab einem bestimmten Offset kopieren möchten. Für ein neues Array macht Arrays.copyOfRange() die Absicht meist deutlicher.
Apache Commons Lang mit ArrayUtils.subarray() verwenden
Apache Commons Lang ist eine externe Abhängigkeit; das JDK allein stellt ArrayUtils nicht bereit. Fügen Sie die Bibliothek commons-lang3 zum Projekt hinzu und importieren Sie org.apache.commons.lang3.ArrayUtils, bevor Sie ArrayUtils.subarray() verwenden. Der Startindex ist eingeschlossen, der Endindex ausgeschlossen; zurückgegeben wird ein neues Array mit dem ausgewählten Bereich. Für diese externe Abhängigkeit liegt kein Ausführungsnachweis vor. Deshalb steht der Aufruf direkt im Text und wird nicht als angeblich ausführbares Programm dargestellt: Integer[] part = ArrayUtils.subarray(values, 1, 4);. Eingabe und Ergebnis sind vom Typ Integer[]. Primitive Arrays wie int[] haben einen anderen Typ und passen nicht zu diesem generischen Aufruf. Diese Möglichkeit eignet sich für Projekte, die Commons Lang bereits verwenden.
Eine Liste und subList() verwenden
Bei Objekt-Arrays liefert Arrays.asList() eine Liste fester Größe, die vom Array unterstützt wird. subList(from, to) gibt eine Ansicht dieser Liste zurück und kopiert kein Array. Ein Aufruf von toArray() mit einem korrekt typisierten Ziel erzeugt das neue Array. Dieser Ansatz erfordert zusätzliche Umwandlungen und ist vor allem dann nützlich, wenn die anschließende Verarbeitung ohnehin Listenoperationen verwendet. Weitere Informationen finden Sie unter ein Array in Java in eine Liste umwandeln.
Die Bezeichnungen und Ausgaben im unveränderten Codebeispiel sind auf Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.util.Arrays;
import java.util.List;
public class ListRange {
public static void main(String[] args) {
String[] values = {"red", "green", "blue", "gold"};
List<String> view = Arrays.asList(values).subList(1, 3);
String[] part = view.toArray(new String[0]);
System.out.println(Arrays.toString(part));
}
}
Wie bei anderen Listenbereichen ist from eingeschlossen und to ausgeschlossen. Änderungen an den Elementen des zugrunde liegenden Arrays werden in der Ansicht sichtbar. Das von toArray() zurückgegebene Array ist ein separates Array.
Eine benutzerdefinierte Methode zum Ermitteln eines Teilarrays schreiben
Eine benutzerdefinierte Methode ist hilfreich, wenn beim Kopieren anwendungsspezifische Prüfungen oder zusätzliche Verarbeitung erforderlich sind. Für einen einfachen zusammenhängenden Bereich sollten Sie stattdessen Arrays.copyOfRange() verwenden, anstatt dessen Funktionalität nachzubilden. Diese generische Methode nimmt Referenz-Arrays entgegen und überlässt der Bibliotheksmethode das Verhalten beim Auswählen des Bereichs:
Die Bezeichnungen und Ausgaben im unveränderten Codebeispiel sind auf Englisch:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import java.util.Arrays;
public class CustomArrayRange {
public static <T> T[] subset(T[] values, int from, int to) {
return Arrays.copyOfRange(values, from, to);
}
public static void main(String[] args) {
String[] values = {"oak", "pine", "elm", "ash"};
System.out.println(Arrays.toString(subset(values, 1, 3)));
}
}
Der Komponententyp des Eingabe-Referenzarrays bleibt dabei erhalten. Für primitive Arrays benötigen Sie eine passende Überladung für jeden primitiven Typ oder einen anderen Ansatz. Werte anhand einer Bedingung auszuwählen, etwa nur gerade Zahlen zu behalten, ist Filtern und nicht das Extrahieren eines zusammenhängenden Bereichs. Beim Filtern können sich Anzahl und Position der ausgewählten Elemente ändern.
Den passenden Ansatz zum Ermitteln eines Array-Teils wählen
Verwenden Sie Arrays.copyOf() für ein Präfix oder ein neues Array mit der gewünschten Länge. Für einen direkten zusammenhängenden Bereich, auch bei primitiven Arrays, eignet sich Arrays.copyOfRange(). Wählen Sie IntStream, wenn die Auswahl der Indizes Teil einer Stream-Pipeline ist, und System.arraycopy(), wenn es auf eine explizite Positionierung im Zielarray ankommt. Verwenden Sie ArrayUtils.subarray(), wenn das Projekt bereits von Apache Commons Lang abhängt. subList() eignet sich, wenn Listenoperationen nützlich sind und vor der Umwandlung zurück ein Ansichtsobjekt ausreicht. Eine benutzerdefinierte Methode bietet sich für zusätzliche Anwendungslogik an; für einen gewöhnlichen Bereich ist die Standardmethode für Arrays einfacher. Prüfen Sie bei jedem Ansatz, ob die Indizes die gewünschten Elemente erfassen, und beachten Sie, dass der Endindex exklusiv ist.