2010-10-28 49 views
17

Estoy tratando de encontrar la forma de eliminar un elemento de una lista en Groovy desde un círculo.¿Cómo recorro una lista y elimino un elemento en groovy?

static main(args) { 
    def list1 = [1, 2, 3, 4] 
    for(num in list1){ 
    if(num == 2) 
     list1.remove(num) 
    } 
    println(list1) 
} 
+0

Solo para aclarar. Sé que no necesito el ciclo, pero esto demuestra lo que estoy tratando de hacer sin poner un montón de lógica adicional en el ejemplo. – ScArcher2

Respuesta

12

Si desea eliminar el elemento con índice 2, puede hacerlo

list = [1,2,3,4] 
list.remove(2) 
assert list == [1,2,4] 

// or with a loop 
list = [1,2,3,4] 
i = list.iterator() 
2.times { 
    i.next() 
} 
i.remove() 
assert list == [1,2,4] 

Si desea eliminar el elemento (primera) con valor 2, puede hacerlo

list = [1,2,3,4] 
list.remove(list.indexOf(2)) 
assert list == [1,3,4] 

// or with a loop 
list = [1,2,3,4] 
i = list.iterator() 
while (i.hasNext()) { 
    if (i.next() == 2) { 
     i.remove() 
     break 
    } 
} 
assert list == [1,3,4] 
+0

en realidad, esto realmente no funciona. 'i = my.object.here.iterator()' simplemente no funciona – Sliq

+0

Funciona con listas. Debería funcionar con cualquier objeto que implemente la interfaz 'Iterable' o que tenga un método' iterator() '. – ataylor

4

Creo que se puede hacer:

list - 2; 

o ...

list.remove(2) 

No hay bucle requerida.

Si desea utilizar un bucle, supongo que podría utilizar el iterador para eliminar el elemento.

import java.util.Iterator; 

static main(args) { def list1 = [1, 2, 3, 4] 
    Iterator i = list1.iterator(); 
    while (i.hasNext()) { 
     n = i.next(); 
     if (n == 2) i.remove(); 
    } 
    println(list1) 
}​ 

pero no veo por qué querría hacerlo de esa manera.

+0

El ejemplo realmente tenía la intención de ser solo un ejemplo de alguna situación del mundo real. Terminé usando el iterador para eliminar y funcionó muy bien. ¡Gracias! – ScArcher2

17
list = [1, 2, 3, 4] 
newList = list.findAll { it != 2 } 

deben darle todo menos el 2

Por supuesto, es posible que tenga una razón para exigir el bucle?

+0

Eso no explica la ConcurrentModificationException de Java que el OP (póster original) había recibido (la solución más probable sobre ese tema sería usar una CopyOnWriteArrayList en el mundo de Java), pero, en mi opinión, esta es la forma más práctica de Groovy. - Por favor, puede, además, que todos sepan que el método List.remove (int) difiere del método List.remove ((Object) int). – robbbert

+0

En groovy llama eliminar por índice cuando tienes una lista de enteros. – ScArcher2

6

Como dice en su comentario que no requiere específicamente un bucle .... Si está contento de modificar su lista original, puede usar removeAll:

// Remove all negative numbers 
list = [1, 2, -4, 8] 
list.removeAll { it < 0 } 
Cuestiones relacionadas