Java: Holen Sie sich das erste Element aus einer Sammlung

Lesezeit: 5 Minuten

Wenn ich eine Sammlung habe, wie z Collection<String> strs, wie bekomme ich das erste Item raus? Ich könnte einfach anrufen Iteratornehmen Sie es zuerst next()dann werfen Sie die Iterator Weg. Gibt es einen weniger verschwenderischen Weg?

  • Natürlich kann es einen besseren Weg geben, auf das erste Element zuzugreifen, wenn Sie die implementierende Containerklasse kennen …

    – Rookie

    4. November 2009 um 2:32 Uhr

  • Verallgemeinerung für jeden Index: stackoverflow.com/questions/1047957/…

    – Ciro Santilli Путлер Капут 六四事

    23. März 2015 um 16:37 Uhr

  • Es hört sich so an, als müssten Sie Queue.peek()

    – Johannes

    28. Oktober 2015 um 10:21 Uhr

Benutzer-Avatar
jheddings

Sieht so aus, als wäre das der beste Weg, es zu tun:

String first = strs.iterator().next();

Gute Frage … Auf den ersten Blick scheint es ein Versehen für die Collection Schnittstelle.

Beachten Sie, dass “first” nicht immer das erste zurückgibt, was Sie in die Sammlung einfügen, und möglicherweise nur für geordnete Sammlungen sinnvoll ist. Vielleicht gibt es deshalb keine get(item) anrufen, da die Reihenfolge nicht unbedingt eingehalten wird.

Es mag zwar etwas verschwenderisch erscheinen, aber es ist vielleicht nicht so schlimm, wie Sie denken. Das Iterator enthält wirklich nur Indizierungsinformationen in die Sammlung, normalerweise keine Kopie der gesamten Sammlung. Das Aufrufen dieser Methode instanziiert die Iterator Objekt, aber das ist wirklich der einzige Overhead (nicht wie das Kopieren aller Elemente).

Betrachten Sie beispielsweise den Typ, der von der zurückgegeben wird ArrayList<String>.iterator() Methode, wir sehen, dass es ist ArrayList::Itr. Dies ist eine interne Klasse, die nur direkt auf die Elemente der Liste zugreift, anstatt sie zu kopieren.

Stellen Sie einfach sicher, dass Sie die Rücksendung überprüfen iterator() da es leer sein kann oder null je nach Ausführung.

  • Es ist wichtig zu beachten, dass dieser “Trick” nur funktioniert, wenn die Sammlung tatsächlich Inhalt hat. Wenn es leer ist, kann der Iterator einen Fehler zurückgeben, bei dem man vorher die Sammlungsgröße überprüfen muss.

    – Raumgefühl

    6. November 2015 um 17:05 Uhr

  • Dies sollte die richtige Antwort sein. Ich verstehe nicht, warum die Antwort immer lautet “verwenden Sie eine andere Bibliothek!” .

    – Kuzeko

    18. Mai 2016 um 14:44 Uhr


  • Wie wäre es mit dem zweiten Element der Sammlung? Warum funktioniert first->next() nicht? Was sollte ich tun? Vielen Dank!

    – pb772

    18. Mai 2017 um 7:42 Uhr

  • nicht sicher genug, es ist nicht garantiert, dass die Sammlung immer auf das 1. Element zeigt.

    – Nächster Entwickler

    16. Januar 2019 um 19:35 Uhr


  • Dies sollte die akzeptierte Antwort sein: einfach und ohne zusätzliche Anforderungen.

    – Marco Sulla

    24. August 2021 um 12:44 Uhr

Benutzer-Avatar
Carl

Iterables.get(deinC, indexYouWant)

Denn wirklich, wenn Sie Sammlungen verwenden, sollten Sie Google Collections verwenden.

  • Das macht das Gleiche, es prüft nur, ob es sich zuerst um eine Liste handelt, und ruft den Index ab, wenn dies der Fall ist. Es hat auch etwas Code, um zu versuchen, bei einer tatsächlichen Sammlung schneller fehlzuschlagen (das heißt, wenn der Index zu groß ist, versucht er, dies herauszufinden, ohne das Ganze zu durchlaufen und am Ende die Ausnahme auszulösen).

    – Yishai

    4. November 2009 um 3:37 Uhr

  • Ehrlich gesagt könnte es leistungsmäßig etwas langsamer sein als c.iterator().next() – aber der Code ist viel klarer und einfacher zu ändern.

    – Carl

    4. November 2009 um 4:14 Uhr

  • Ich stimme sicherlich zu, dass es sauberer ist, aber das OP war verschwenderisch, aber ich denke, da Ihre Antwort akzeptiert wurde, war dies erwünscht.

    – Yishai

    5. November 2009 um 20:03 Uhr

  • Für diejenigen, die (noch) hier ankommen: Ich denke, die Antwort von jheddings ist wahrscheinlich die beste “Get it done” -Antwort, obwohl ich die von @DonaldRaab (ganz unten auf der Seite) für Fälle bevorzugen würde, in denen ich bereits die GC-Bibliothek verwende. Meine Antwort ist wirklich für den Fall, wo man für später in Flexibilität schreiben möchte (sagen wir, wenn man sich entscheidet, dass die zweite Element ist die neue Schärfe).

    – Carl

    24. Mai 2013 um 10:24 Uhr


  • Manchmal verwenden Sie nur Code, der Sammlungen verwendet, also gibt es nicht viel zu tun.

    – erickrf

    9. August 2015 um 3:08 Uhr

Benutzer-Avatar
Vitalii Fedorenko

Unter Java8:

Optional<String> firstElement = collection.stream().findFirst();

Für ältere Java-Versionen gibt es in Guava eine getFirst-Methode Iterables:

Iterables.getFirst(iterable, defaultValue)

  • Die Java 8-Lösung ist besonders nützlich, da sie den Fall, in dem die Sammlung leer ist, elegant behandelt.

    – SpaceTrucker

    16. Februar 2016 um 8:14 Uhr


  • Nicht gut. Sie fügen den Overhead von stream() hinzu, um ein get(0) zu erhalten, nur weil Sie faul sind, 4 Zeilen Code zu schreiben. if(!CollectionUtils.isEmpty(productList)){ return Optional.of(productList.get(0)); } Rückgabe Optional.empty();

    – RA

    22. März 2017 um 7:18 Uhr


  • Ich habe nicht getFirst Methode zur Verfügung. Es gibt get und getLast Methoden

    – Benutzer1209216

    3. August 2017 um 5:41 Uhr

  • @RS und was passiert, wenn Sie productList.get (0) nicht aufrufen können, da es sich um eine Sammlung handelt? (Gemäß OP-Frage)

    – Denham Coote

    16. November 2017 um 14:17 Uhr

Benutzer-Avatar
OscarRyz

Es gibt kein “erstes” Element in a Collection weil es .. naja einfach eine sammlung ist.

Aus der Java-Dokumentation Collection.iterator() Methode:

Es gibt keine Garantie für die Reihenfolge, in der die Elemente zurückgegeben werden…

Also kannst du nicht.

Wenn du benutzt Ein weiterer Schnittstelle wie z Aufführenkönnen Sie Folgendes tun:

String first = strs.get(0);

Aber direkt aus einer Sammlung ist dies nicht möglich.

Es hört sich so an, als ob Ihre Sammlung listenartig sein möchte, also würde ich vorschlagen:

List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);

Funktionaler Weg:

public static <T> Optional<T> findFirst(List<T> result) {
    return Optional.ofNullable(result)
            .map(List::stream)
            .flatMap(Stream::findFirst);
}

obiges Code-Snippet bewahrt vor NullPointerException und IndexOutOfBoundsException

Benutzer-Avatar
paul

In Java 8 müssen Sie zum Beispiel einige viele Operatoren verwenden Grenze

     /**
 * Operator that limit the total number of items emitted through the pipeline
 * Shall print
 * [1]
 * @throws InterruptedException
 */
@Test
public void limitStream() throws InterruptedException {
    List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
                               .stream()
                               .limit(1)
                               .collect(toList());
    System.out.println(list);
}

  • Die Antwort von @ Vitalii Fedorenko stackoverflow.com/a/18165855/1562662 ist besser.

    – Chacko Mathew

    9. März 2017 um 7:26 Uhr

1014150cookie-checkJava: Holen Sie sich das erste Element aus einer Sammlung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy