Wenn ich eine Sammlung habe, Collection<String> strs
wie kann ich den ersten Artikel herausbringen? Ich könnte einfach einen anrufen Iterator
, seinen ersten nehmen next()
und dann den wegwerfen Iterator
. Gibt es einen weniger verschwenderischen Weg, dies zu tun?
java
collections
iterable
Nick Heiner
quelle
quelle
Antworten:
Iterables.get (yourC, indexYouWant)
Wenn Sie Sammlungen verwenden, sollten Sie Google Sammlungen verwenden.
quelle
Sieht so aus, als wäre das der beste Weg, dies zu tun:
Gute Frage ... Auf den ersten Blick scheint es ein Versehen für die
Collection
Benutzeroberfläche zu sein.Beachten Sie, dass "first" nicht immer das erste zurückgibt, was Sie in die Sammlung aufgenommen haben, und möglicherweise nur für bestellte Sammlungen sinnvoll ist. Vielleicht gibt es deshalb keinen
get(item)
Anruf, da die Reihenfolge nicht unbedingt erhalten bleibt.Es mag ein bisschen verschwenderisch erscheinen, aber es ist vielleicht nicht so schlimm, wie Sie denken. Das
Iterator
enthält wirklich nur Indizierungsinformationen in der Sammlung, normalerweise keine Kopie der gesamten Sammlung. Das Aufrufen dieser Methode instanziiert dasIterator
Objekt, aber das ist wirklich der einzige Overhead (nicht wie das Kopieren aller Elemente).Wenn
ArrayList<String>.iterator()
wir uns beispielsweise den von der Methode zurückgegebenen Typ ansehen, sehen wir, dass dies der Fall istArrayList::Itr
. Dies ist eine interne Klasse, die nur direkt auf die Elemente der Liste zugreift, anstatt sie zu kopieren.Stellen Sie nur sicher, dass Sie die Rückgabe von überprüfen,
iterator()
da diese möglicherweise leer ist odernull
von der Implementierung abhängt.quelle
In Java 8:
Für ältere Versionen von Java gibt es in Guava Iterables eine getFirst-Methode :
quelle
getFirst
Methode zur Verfügung. Es gibtget
undgetLast
MethodenEs gibt kein "erstes" Element in einem
Collection
weil es ... einfach eine Sammlung ist.Aus der Collection.iterator () -Methode des Java-Dokuments :
Also kannst du nicht.
Wenn Sie eine andere Schnittstelle wie List verwenden , können Sie Folgendes tun:
Direkt aus einer Sammlung ist dies jedoch nicht möglich.
quelle
get(int n)
fürCollection
Es hört sich so an, als ob Ihre Sammlung listenartig sein möchte, also würde ich vorschlagen:
quelle
In Java 8 müssen Sie einige Operatoren verwenden, z. B. limit
quelle
Guava bietet ein
onlyElement
Collector
, aber verwenden Sie es nur, wenn Sie erwarten, dass die Sammlung genau ein Element enthält.Wenn Sie sich nicht sicher sind, wie viele Elemente vorhanden sind, verwenden Sie
findFirst
.quelle
Sie können ein Casting machen. Wenn beispielsweise eine Methode mit dieser Definition vorhanden ist und Sie wissen, dass diese Methode eine Liste zurückgibt:
Und nachdem Sie es aufgerufen haben, benötigen Sie das erste Element. Sie können dies folgendermaßen tun:
quelle
Wenn Sie wissen, dass es sich bei der Sammlung um eine Warteschlange handelt, können Sie die Sammlung in eine Warteschlange umwandeln und problemlos abrufen.
Es gibt verschiedene Strukturen, mit denen Sie die Bestellung abrufen können, die Sie jedoch bearbeiten müssen.
quelle
Es hängt ganz davon ab, welche Implementierung Sie verwendet haben, ob die Arraylist-Linkliste oder andere Implementierungen von Set.
Wenn es gesetzt ist, können Sie direkt das erste Element abrufen, es kann eine Trickschleife über die Sammlung sein, eine Variable mit dem Wert 1 erstellen und den Wert abrufen, wenn der Flag-Wert 1 ist, nachdem diese Schleife unterbrochen wurde.
Wenn es sich um die Implementierung einer Liste handelt, ist es einfach, die Indexnummer zu definieren.
quelle
Funktionsweise:
obiges Code-Snippet aus NullPointerException und IndexOutOfBoundsException erhalten
quelle
List<T>
erfüllt nicht die Bedingung, dass es für a funktionieren sollteCollection<String>
, aber das kann natürlichCollection<T>
mit der zusätzlichen Änderung behoben werden :.map(Collection::stream)
.Sie könnten dies tun:
Das Javadoc für die Sammlung enthält die folgenden Einschränkungen hinsichtlich der Reihenfolge der Elemente des Arrays:
quelle