web-dev-qa-db-de.com

Java erhält das letzte Element einer Sammlung

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?

39
tom

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;
    }
6
nikolai.serdiuk

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;
}
52
Jack Edmonds

Iterables.getLast von Google Guava . Auch für Lists und SortedSets gibt es einige Optimierungen.

43
palacsint

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)

9
kukudas

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();
}
3
Nick Garvey

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.

2
Piyush Mattoo

Oder Sie können eine for-each-Schleife verwenden:

Collection<X> items = ...;
X last = null;
for (X x : items) last = x;
0
assylias

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 ...

0
nikeros