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?
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;
}
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;
}
Iterables.getLast
de Google Guava . Il a également une optimisation pour List
s et SortedSet
s.
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)
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();
}
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
Ou vous pouvez utiliser une boucle for-each:
Collection<X> items = ...;
X last = null;
for (X x : items) last = x;
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 ...