2010-06-08 16 views
6

¿Hay algún método en JDK o apache commons para "mostrar" una lista de elementos de una java.util.List? Es decir, eliminar la lista de elementos y devolverlo, al igual que este método:Cómo extraer elementos de una colección en Java?

public Collection pop(Collection elementsToPop, Collection elements) { 

    Collection popped = new ArrayList(); 

    for (Object object : elementsToPop) { 
    if (elements.contains(object)) { 
     elements.remove(object); 
     popped.add(object); 
    } 
    } 

    return popped; 
} 
+2

hacer la nota que se puede comprobar el resultado de remove() y pasa el cheque contiene en su código. –

+1

Es posible que también desee consultar [genéricos] (http://java.sun.com/docs/books/tutorial/java/generics/index.html) para trabajar con colecciones. – Pops

Respuesta

10

Si usted está buscando una estructura de pila Sugiero aceptar una (es la aplicación más común LinkedList) Deque en lugar de una Collection.

Si en realidad no necesita tratarlo como una pila, acaba de obtener un iterador de la Collection y utilizar el método de remove():

for (Iterator<SomeType> it = elements.iterator(); it.hasNext();) { 
    SomeType e = it.next(); 
    it.remove(); 
    popped.add(e); 
} 

tenga en cuenta que eliminar es una operación opcional, y algunas implementaciones puede arrojar un UnsupportedOperationException (por ejemplo, el iterador devuelto por una Colección de Collections.unmodifiable...() lo hará).

Editar: Después de mirar más de cerca a su pregunta, creo que sólo tiene esto:

elements.removeAll(elementsToRemove); 

Si su punto principal es que necesita saber exactamente cuales elementos fueron de hecho estallar, creo estás atascado con tu código original.

+1

En realidad, parece que no leí lo suficiente. Tienes una definición muy poco estándar de "pop" que me induce a publicar esta respuesta. Más respuesta aplicable que viene. –

+0

Sé que "pop" no era la mejor palabra para usar, así que di un ejemplo de lo que quería. Pero parece que no hay un método como este implementado para JDK o apache commons, por lo que, a estas alturas, continuará con el mío, y utilizaré su sugerencia de Iterator, ¡gracias! –

1

Supongo que no, porque su definición de operación 'pop' es altamente no estándar. Por lo general, no requiere argumentos (excepto la propia recopilación) y devuelve y elimina el que está más arriba.

Pero una vez que haya notado Apache commons, obtendrá el mismo efecto que su código.

Collection result = CollectionUtils.intersection(a, b); 
a.removeAll(b); 

edición
http://commons.apache.org/collections/api-release/index.html

0

No hay un método exactamente igual que lo que está pidiendo, pero parece que ya está bastante cerca con su código.

Algunas sugerencias:

  • Considere el uso de removeAll (objeto) en lugar de quitar (objeto) si los elementos es una colección arbitraria ya que puede que tenga que eliminar duplicados, por ejemplo, si los elementos son una lista.

  • contiene() es lento para algunos tipos de colecciones (por ejemplo, listas) ya que necesita atravesar toda la estructura de datos. Dado que esto está en su ciclo interno, corre el riesgo de O (n^2) problemas de rendimiento. Si puede hacer que el algoritmo funcione con un HashSet o HashMap, entonces contendrá() lo hará con O (1) y su algoritmo será mucho más eficiente.

2

No existe tal método en los procedimientos proporcionados-JDK estándar. Apache Commons proporciona the ListUtils.subtract() method.

Editar: Como han notado otros respondedores, su uso del término pop no es estándar.Por lo general,

La operación pop elimina un elemento de la parte superior de [una pila]

Wikipedia tiene un nice description of stacks.

+1

+1 para restar; removeAll no respeta la cardinalidad como lo hace el fragmento del póster. Pero esto no te da una lista de elementos que fueron eliminados realmente como lo hace su. –

+0

@Mark, hm, tienes razón; Leí la descripción, pero no la fuente, y malentendí. +1, seguiré buscando. – Pops

1

Lista vinculada proporciona la funcionalidad que necesita, proporciona un método push y pop.

Consulte la documentation según lo previsto:

Cuestiones relacionadas