ti-enxame.com

Java obtém o último elemento de uma coleção

Eu tenho uma coleção, quero obter o último elemento da coleção. Qual é a maneira mais direta e rápida de fazer isso?

Uma solução é primeiro para Array () e, em seguida, retornar o último elemento da matriz. Existe algum outro melhor?

39
tom

Não é uma solução muito eficiente, mas trabalhando uma:

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

Um Collection não é um conjunto de elementos necessariamente ordenado, portanto, pode não haver um conceito do elemento "last". Se você quer algo que é pedido, você pode usar um SortedSet que tenha um método last(). Ou você pode usar um List e chamar mylist.get(mylist.size()-1);

Se você realmente precisar do último elemento, você deve usar um List ou um SortedSet. Mas se tudo que você tem é um Collection e você realmente, realmente, realmente precisar do último elemento, você poderia usar toArray() ou você poderia usar um Iterator e iterar até o final da lista. 

Por exemplo:

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 do Google Goiaba. Tem alguma otimização para Lists e SortedSets também.

43
palacsint

Bem, uma solução poderia ser:

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

Edit: Você tem que converter a coleção para uma lista antes talvez assim: new ArrayList (coll)

9
kukudas

Uma solução razoável seria usar um iterador se você não souber nada sobre a Coleção subjacente, mas souber que existe um elemento "último". Isso nem sempre é o caso, nem todas as coleções são ordenadas.

Object lastElement = null;

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

Não há um método last() ou first() em uma interface Collection. Para obter o último método, você pode fazer get(size() - 1) em uma lista ou inverter a lista e fazer get(0). Não vejo necessidade de ter o método last() em qualquer API de coleção, a menos que você esteja lidando com Stacks ou Queues

2
Piyush Mattoo

Ou você pode usar um loop for-each:

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

Para evitar alguns dos problemas mencionados acima (não robusto para nulos, etc, etc), para obter o primeiro e último elemento em uma lista, uma abordagem poderia ser

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

A convenção adotada é que o primeiro/último elemento de uma lista vazia é nulo ...

0
nikeros