Ich habe eine Sammlung, ich möchte das letzte Element der Sammlung erhalten. Was ist der einfachste und schnellste Weg, dies zu tun?
Eine Lösung besteht darin, zuerst toArray () und dann das letzte Element des Arrays zurückzugeben. Gibt es noch andere bessere?
Es ist keine sehr effiziente Lösung, aber eine funktionierende:
public static <T> T getFirstElement(final Iterable<T> elements) {
if (elements == null)
return null;
return elements.iterator().next();
}
public static <T> T getLastElement(final Iterable<T> elements) {
final Iterator<T> itr = elements.iterator();
T lastElement = itr.next();
while(itr.hasNext()) {
lastElement=itr.next();
}
return lastElement;
}
Eine Collection
ist nicht notwendigerweise eine geordnete Menge von Elementen, daher gibt es möglicherweise kein Konzept des "letzten" Elements. Wenn Sie etwas bestellen möchten, können Sie eine SortedSet
verwenden, die eine last()
-Methode hat. Oder Sie können eine List
verwenden und mylist.get(mylist.size()-1);
aufrufen.
Wenn Sie wirklich das letzte Element benötigen, sollten Sie eine List
oder eine SortedSet
verwenden. Wenn Sie jedoch nur eine Collection
haben und Sie wirklich, wirklich, wirklich das letzte Element benötigen, können Sie toArray()
oder eine Iterator
verwenden und bis zum Ende der Liste durchlaufen.
Zum Beispiel:
public Object getLastElement(final Collection c) {
final Iterator itr = c.iterator();
Object lastElement = itr.next();
while(itr.hasNext()) {
lastElement = itr.next();
}
return lastElement;
}
Iterables.getLast
von Google Guava . Auch für List
s und SortedSet
s gibt es einige Optimierungen.
Nun, eine Lösung könnte sein:
list.get(list.size()-1)
Edit: Sie müssen die Collection vorher in eine Liste konvertieren: new ArrayList (coll)
Eine sinnvolle Lösung wäre die Verwendung eines Iterators, wenn Sie nichts über die zugrunde liegende Collection wissen, jedoch wissen, dass es ein "letztes" Element gibt. Dies ist nicht immer der Fall, nicht alle Kollektionen werden bestellt.
Object lastElement = null;
for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
lastElement = collectionItr.next();
}
Es gibt keine last()
- oder first()
-Methode in einer Collection-Schnittstelle. Um die letzte Methode zu erhalten, können Sie entweder get(size() - 1)
auf einer Liste ausführen oder die Liste umkehren und get(0)
ausführen. Ich sehe keine Notwendigkeit, die last()
-Methode in einer Erfassungs-API zu verwenden, es sei denn, Sie haben mit Stacks
oder Queues
zu tun.
Oder Sie können eine for-each-Schleife verwenden:
Collection<X> items = ...;
X last = null;
for (X x : items) last = x;
Um einige der oben genannten Probleme zu vermeiden (nicht robust für Nullen usw.), könnte man als erstes und letztes Element in einer Liste einen Ansatz finden
import Java.util.List;
public static final <A> A getLastElement(List<A> list) {
return list != null ? getElement(list, list.size() - 1) : null;
}
public static final <A> A getFirstElement(List<A> list) {
return list != null ? getElement(list, 0) : null;
}
private static final <A> A getElement(List<A> list, int pointer) {
A res = null;
if (list.size() > 0) {
res = list.get(pointer);
}
return res;
}
Die übliche Konvention ist, dass das erste/letzte Element einer leeren Liste null ist ...