web-dev-qa-db-fra.com

Java récupère le dernier élément d'une collection

J'ai une collection, je veux obtenir le dernier élément de la collection. Quel est le moyen le plus direct et le plus rapide de le faire?

Une solution consiste à commencer par toArray (), puis à renvoyer le dernier élément du tableau. Y a-t-il d'autres meilleurs?

39
tom

Ce n'est pas une solution très efficace, mais une solution efficace:

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

Une Collection n'est pas un ensemble d'éléments nécessairement ordonné, de sorte qu'il peut ne pas y avoir de concept du "dernier" élément. Si vous voulez quelque chose qui est commandé, vous pouvez utiliser une SortedSet qui a une méthode last(). Ou vous pouvez utiliser un List et appeler mylist.get(mylist.size()-1);

Si vous vraiment avez besoin du dernier élément, vous devez utiliser un List ou un SortedSet. Mais si tout ce que vous avez est une Collection et que vous avez vraiment, vraiment, vraiment besoin du dernier élément, vous pouvez utiliser toArray() ou vous pouvez utiliser une Iterator et parcourir la fin de la liste. 

Par exemple:

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 de Google Guava . Il a également une optimisation pour Lists et SortedSets.

43
palacsint

Eh bien, une solution pourrait être:

list.get(list.size()-1)

Edit: vous devez convertir la collection en une liste avant peut-être comme ceci: new ArrayList (coll)

9
kukudas

Une solution raisonnable serait d'utiliser un itérateur si vous ne connaissez rien à la collection sous-jacente, mais savez qu'il existe un "dernier" élément. Ce n'est pas toujours le cas, toutes les collections ne sont pas ordonnées.

Object lastElement = null;

for (Iterator collectionItr = c.iterator(); collectionItr.hasNext(); ) {
  lastElement = collectionItr.next();
}
3
Nick Garvey

Il n'y a pas de méthode last() ou first() dans une interface Collection. Pour obtenir la dernière méthode, vous pouvez soit faire get(size() - 1) sur une liste, soit inverser la liste et faire get(0). Je ne vois pas la nécessité d'avoir la méthode last() dans les API de collection, sauf si vous avez affaire à Stacks ou Queues

2
Piyush Mattoo

Ou vous pouvez utiliser une boucle for-each:

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

Pour éviter certains des problèmes mentionnés ci-dessus (non robustes pour les valeurs nulles, etc.), pour obtenir le premier et le dernier élément d'une liste, une approche peut être

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;
}

La convention adoptée est que le premier/dernier élément d'une liste vide est nul ...

0
nikeros