Ich würde gerne wissen, ob ich das erste Element einer Liste oder eines Satzes erhalten kann. Welche Methode verwenden?
Wie bekomme ich das erste Element der Liste oder des Sets? [duplicate]
Benutzer496949
Stapler
Siehe javadoc
von Aufführen
list.get(0);
oder Satz
set.iterator().next();
und überprüfen Sie die Größe, bevor Sie die obigen Methoden durch Aufrufen verwenden isEmpty()
!list_or_set.isEmpty()
-
Verwenden
isEmpty()
Anstatt vonsize()>0
. Es zeigt Ihre Absicht besser und ist möglicherweise effizienter (z. B. LinkList size() ist O(n)).– Steve Kuo
16. Januar 2012 um 20:10 Uhr
-
@SteveKuo LinkedList hat eine Größenvariable, also ist size() O(1). Zusätzlich wird isEmpty() als size() == 0 implementiert.
– efritz
10. Mai 2014 um 22:49 Uhr
-
Verwenden Sie immer
List.iterator().next()
oderSet.iterator().next()
Um O(N) für verknüpfte Datenstrukturen zu vermeiden, wissen Sie nie, welche Implementierung Sie erhalten, und überprüfen dies natürlich durch VerwendungSet.isEmpty()
oderList.isEmpty()
aus dem gleichen Grund wird für beide Fälle immer O(1) anstelle eines potentiellen O(N) sein, wenn wiederum eine Implementierung einer verknüpften Datenstruktur wie gewünscht übergeben wirdLinkedList
oderLinkedHashSet
– Guido Medina
11. Mai 2015 um 15:51 Uhr
-
Dies sollte die akzeptierte Antwort sein, obwohl sie nicht zu ausführlich ist, aber die genaueste Antwort gibt und perfekt funktioniert!
– Arturas M
9. September 2016 um 8:55 Uhr
Collection c;
Iterator iter = c.iterator();
Object first = iter.next();
(Dies kommt dem “ersten” Element von a am nächsten Set
. Sie sollten sich darüber im Klaren sein, dass es für die meisten Implementierungen von absolut keine Bedeutung hat Set
. Dies kann für LinkedHashSet und TreeSet von Bedeutung sein, aber nicht für HashSet.)
-
nützlich, wenn Sie einfach so schnell wie möglich etwas aus dem Set bekommen möchten
– HaydenKai
13. September 2016 um 23:10 Uhr
-
Gut genug, wenn Ihr Set nur ein Element hat.
– Milosmen
15. September 2017 um 15:02 Uhr
-
Sammlung c; c.iterator().next();
– Faseela Thayattuchira
14. Januar 2021 um 8:10 Uhr
Sonson123
In Java >=8 können Sie auch die Streaming-API verwenden:
Optional<String> first = set.stream().findFirst();
(Nützlich, wenn Set/List möglicherweise leer ist.)
-
Das sieht toll aus, aber ohne get() könnte ich keine resultierenden elementspezifischen Methoden aufrufen.
set.stream().findFirst().get()
ermöglicht es Ihnen, beliebige Methoden für das resultierende Objekt aufzurufen. z.B:set.stream().findFirst().get().getMessage()
– Diablo
14. Juli 2016 um 11:26 Uhr
-
@Diablo Sei aber vorsichtig, denn
get()
löst eine Ausnahme aus, wenn das optionale Feld leer ist. Es gibt viele andere Methoden aufOptional
das wäre vielleicht besser geeignet.– Magnilex
28. Februar 2017 um 8:06 Uhr
-
Wenn Sie möchten, dass es null zurückgibt, tun Sie es einfach
String first = set.stream().findFirst().orElse(null);
– Troosan
29. Januar 2018 um 14:27 Uhr
-
@troosan Dies ist immer noch nicht nullsicher, da das erste Element des Satzes sein kann
null
in welchem FallfindFirst()
wird NPE werfen. Der nullsichere Weg besteht darin, Folgendes zu verwenden:set.stream().map(Optional::ofNullable).findFirst().orElseGet(Optional::empty).orElse(null)
. Zuerst packen wir das erste Element des Streams in Optional, dann afterfindFirst()
(was unser Optional in ein anderes Optional einwickelt) packen wir es wieder aus oder kehren zurückOptional.empty()
wenn Set leer war. Dann geben wir schließlich das erste Element von Set oder null zurück.– Ruslan Stelmachenko
12. März 2018 um 18:28 Uhr
-
@djxak in der Tat haben Sie Recht, Ihr Vorschlag ist natürlich sicherer, wenn Sie nicht sicher sind, was das Set enthält (und welche Implementierung des Sets verwendet wird).
– Troosan
14. März 2018 um 10:52 Uhr
Ch Vas
Nehmen wir an, Sie haben eine List<String> strings
von dem Sie das erste Element haben möchten.
Dazu gibt es mehrere Möglichkeiten:
Java (vor 8):
String firstElement = null;
if (!strings.isEmpty() && strings.size() > 0) {
firstElement = strings.get(0);
}
Java 8:
Optional<String> firstElement = strings.stream().findFirst();
Guave
String firstElement = Iterables.getFirst(strings, null);
Apache Commons (4+)
String firstElement = (String) IteratorUtils.get(strings, 0);
Apache Commons (vor 4)
String firstElement = (String) CollectionUtils.get(strings, 0);
Gefolgt von oder eingekapselt in die entsprechenden Checks oder Try-Catch-Blöcke.
Kotlin:
In Kotlin beides Arrays und die meisten Sammlungen (zB: Liste) haben a first
Methodenaufruf. Ihr Code würde also in etwa so aussehen
für eine Liste:
val stringsList: List<String?> = listOf("a", "b", null)
val first: String? = stringsList.first()
für ein Array:
val stringArray: Array<String?> = arrayOf("a", "b", null)
val first: String? = stringArray.first()
Gefolgt von oder eingekapselt in die entsprechenden Checks oder Try-Catch-Blöcke.
Kotlin bietet auch sicherere Möglichkeiten, dies zu tun kotlin.collections
zum Beispiel firstOderNull oder getOrElseoder getOrDefault beim Benutzen JRE8
Ich bin überrascht, dass noch niemand eine Guave-Lösung vorgeschlagen hat:
com.google.common.collect.Iterables.get(collection, 0)
// or
com.google.common.collect.Iterables.get(collection, 0, defaultValue)
// or
com.google.common.collect.Iterables.getFirst(collection, defaultValue)
oder wenn Sie ein einzelnes Element erwarten:
com.google.common.collect.Iterables.getOnlyElement(collection, defaultValue)
// or
com.google.common.collect.Iterables.getOnlyElement(collection)
Yassin Hajaj
java8 und mehr
Set<String> set = new TreeSet<>();
set.add("2");
set.add("1");
set.add("3");
String first = set.stream().findFirst().get();
Dies hilft Ihnen, das erste Element der Liste oder Menge abzurufen. Da die Menge oder Liste nicht leer ist (get()
auf leer optional wird werfen java.util.NoSuchElementException
)
orElse()
kann verwendet werden als: (Dies ist nur eine Problemumgehung – nicht empfohlen)
String first = set.stream().findFirst().orElse("");
set.removeIf(String::isEmpty);
Nachfolgend finden Sie die geeignete Vorgehensweise:
Optional<String> firstString = set.stream().findFirst();
if(firstString.isPresent()){
String first = firstString.get();
}
Auf ähnliche Weise kann das erste Element der Liste abgerufen werden.
Hoffe das hilft.
Wassil Waltschew
Satz
set.toArray()[0];
Aufführen
list.get(0);
-
set.toArray()[0]
muss den gesamten Satzinhalt durchlaufen, um ein Array zu erstellen, um nur das erste Element zu erhalten, was nicht sehr effektiv ist.– pedro
13. Mai 2016 um 16:12 Uhr
-
dies führt zu einer sehr geringen Leistung
– ZetaPR
6. April 2017 um 16:50 Uhr
-
Für eine Menge gibt diese Methode an zurück
Object
und nicht die Art des Elements in derSet
.– Paulus
22. Februar 2018 um 18:50 Uhr
Set hat kein erstes Element. Für Liste: list.get(0);
– Piotr Gwiazda
16. Januar 2012 um 15:40 Uhr
Was hast du, eine Liste oder ein Set? Sets müssen nicht unbedingt in einer bestimmten Reihenfolge sein …
– NominSim
16. Januar 2012 um 15:40 Uhr
Einige Sets werden bestellt, wie z
TreeSet
.– Steve Kuo
16. Januar 2012 um 20:12 Uhr
Auch ein Set mit exakt ein Element hat ein “erstes” Element.
– Magnilex
23. Januar 2017 um 15:42 Uhr
Versuchen
CollectionUtils.get(Object,index)
aus Apache Commons Bibliothek. Bezug hier– Diablo
12. Dezember 2017 um 15:17 Uhr