2011-12-02 14 views
35

Tengo una colección, quiero obtener el último elemento de la colección. ¿Cuál es la forma más directa y rápida de hacerlo?Java obtener el último elemento de una colección

Una solución es primero toArray(), y luego devolver el último elemento de la matriz. ¿Hay otros mejores?

Respuesta

3

No es una solución muy eficiente, pero trabajando uno:

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

Bueno, una solución podría ser:

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

Editar: Usted tiene que convertir la colección a una lista antes quizá de esta manera: new ArrayList (col)

+0

por eso es necesario para construir la lista utilizando la colección en primer lugar. En cuanto al rendimiento, ¿será diferente de la solución de Array? – tom

+0

Si todo lo que está haciendo es obtener el último elemento, es más eficiente usar toArray() que compilar un ArrayList – mwk

+0

La pregunta menciona que es una colección, no una lista. Ahora, para convertirlo en una lista solo para tener el último elemento es una mala solución y puede llevar a cuellos de botella de rendimiento si tiene grandes colecciones. Utilice el método Iterable.getLast de Guava en su lugar. – javadev

3

Una solución razonable sería utilizar una iterador si no sabe nada sobre la Colección subyacente, pero sabe que hay un "último" elemento. Este no es siempre el caso, no todas las colecciones están ordenadas.

Object lastElement = null; 

for (Iterator collectionItr = c.iterator(); collectionItr.hasNext();) { 
    lastElement = collectionItr.next(); 
} 
+1

Correcto, no sé el tipo subyacente de la colección. Pero si se trata de una gran colección, entonces será una solución O (N). Básicamente, estoy buscando una solución O (1). – tom

+0

Eso no es posible. Considere tratar de obtener el último elemento de una lista individualmente vinculada.Esa operación * tiene * ser O (n), no hay una respuesta genérica O (1). –

48

Un Collection no es necesariamente un conjunto ordenado de elementos por lo que no puede haber un concepto de elemento "último". Si quiere algo que está ordenado, puede usar un SortedSet que tiene un método last(). O puede utilizar un List y llamar a mylist.get(mylist.size()-1);

Si realmente necesita el último elemento que se debe utilizar un List o una SortedSet. Pero si todo lo que tiene es un Collection y realmente, realmente, realmente necesita el último elemento, puede usar toArray() o puede usar un Iterator e iterar hasta el final de la lista.

Por ejemplo:

public Object getLastElement(final Collection c) { 
    final Iterator itr = c.iterator(); 
    Object lastElement = itr.next(); 
    while(itr.hasNext()) { 
     lastElement = itr.next(); 
    } 
    return lastElement; 
} 
+0

Solo tengo colección disponible, no sé si es tipo fundamental ya sea matriz, lista u otros. Entonces, para usar SortedSet, primero tendría que construir SortedSet usando la colección, y luego hacer el resto del trabajo. ¿Será eso caro? – tom

+0

@tom Probablemente sería O (n * lg (n)) para construir el 'SortedSet' (si lo construyó todo de una vez). Entonces, dependiendo de cuántos artículos espere tener, podría ser bastante caro. Por lo general, si su tipo subyacente está ordenado, al menos puede convertirlo en una 'Lista 'incluso si no sabe qué tipo de' Lista' es. –

+0

Gracias @Jack, supongo que mis datos están ordenados al regresar a mí, ya que son el caso, ¿habrá otra solución? – tom

2

No hay un método last() o first() en una interfaz de Colección. Para obtener el último método, puede hacer get(size() - 1) en una lista o invertir la lista y hacer get(0). No veo la necesidad de tener last() método en el API de cualquier colección a menos que se trata de Stacks o Queues

+0

La colección tampoco tiene un método get. – tom

+0

¡Claro! Quise decir la implementación de la Lista de la interfaz de Colección. –

33

Iterables.getLast de Google guayaba. Tiene alguna optimización para List sy SortedSet s también.

+0

No es seguro. Obtiene NPE si su colección es nula. – DenisS

0

O puede usar una para-cada bucle:

Collection<X> items = ...; 
X last = null; 
for (X x : items) last = x; 
Cuestiones relacionadas