2010-10-22 8 views
6

Soy un programador de Java relativamente nuevo y estoy teniendo dificultades para eliminar más de un elemento de una ArrayList. Idealmente me gustaría hacer algo como esto:¿Cómo elimino los elementos secuenciales de una Java ArrayList?

ArrayList ar1 = new ArrayList(); 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 

for (int i = 0; i < 2; i++){ 
    ar1.remove(i); 
} 

creo iterador podría ayudar, pero no puedo encontrar un ejemplo que coincide bastante cerca de lo que estoy tratando de hacer. Cualquier ayuda sería apreciada. Gracias.

Respuesta

20

Esto es lo que quiere hacer:

ar1.subList(0, 2).clear(); 

Esto crea una vista de lista secundaria de los 2 primeros elementos de la lista y luego se aclarará que la lista secundaria, sacándolos de la lista original. El método subList existe principalmente para este tipo de cosas ...haciendo operaciones en un rango específico de la lista.

+0

+1 excelente respuesta. – aioobe

+0

+1 Es lo que los documentos de API sugieren que hagas. (Por lo general, no puede ser tan eficiente como múltiples llamadas 'remove'.) –

+0

A menos que los elementos que OP desea eliminar no sean secuenciales. Depende de los detalles. –

2

Puede usar Collection.removeAll (toRemove) si tiene una lista separada de objetos para eliminar.

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Si su colección se basa en un índice, como ArrayList es, puede llamar

remove(index) 

para eliminar el elemento en el índice. Puede hacer eso en un bucle, pero tenga en cuenta que la eliminación cambia todos los índices como lo indica otra respuesta.

Si todo lo que quiere hacer es quitar los dos primeros elementos de la lista, a continuación,

list.remove(0); 
    list.remove(0); 

debe hacerlo.

+0

mi error me leen demasiado rápido y pensó que estaba tratando de evitar artículos duplicados. removeAll todavía está por encima de kill en este escenario – Woot4Moo

+0

Pero 'removeAll' eliminará ** todas las apariciones ** de los elementos que contiene el argumento, del destinatario, es decir, no es lo mismo que eliminar el primero de los elementos de ArrayList . – aioobe

+0

@aioobe tienes razón. – hvgotcodes

5

Por supuesto que puede hacer que

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    for (int i = 0; i < 2; i++) { 
     ar1.remove(i); 
    } 
    System.out.println(ar1); 

pagar sólo la atención que después de quitar primer elemento, otros elementos de cambio. Por lo tanto, llamando al

ar1.remove(0); 
ar1.remove(1); 

eliminará efectivamente los elementos primero y tercero de la lista. Esto eliminará dos primeros elementos, sin embargo:

ar1.remove(0); 
ar1.remove(0); 
+0

¿De qué manera esto depende del tipo de cosas almacenadas en la lista? –

+0

@Stephen Mi mal, confundí las cosas. –

3

Para el traslado de indexado de la lista, es necesario contar hacia atrás:

for (int i = 1; i >= 0; i--) 

lo contrario, su primera retirada desplaza los elementos "más arriba" en el colección y no terminas eliminando los artículos que crees que estás eliminando.

1

Usted podría intentar esto:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
int i = 0; 
while (i < 2 && it.hasNext()) { 
    it.next(); 
    it.remove(); 
    i++; 
} 

O, en términos más generales:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
while (it.hasNext()) { 
    Whatever next = it.next(); 
    if (shouldRemove(next)) { 
     it.remove(); 
    } 
} 

EDIT: Supongo que depende de si usted está tratando de eliminar los índices particulares u objetos particulares. También depende de la cantidad de lógica que necesita para decidir si se debe eliminar algo. Si conoce los índices, elimínelos en orden inverso. Si tiene un conjunto de Objetos a eliminar, entonces use removeAll. Si desea iterar sobre la lista y eliminar objetos que coinciden con un predicado, utilice el código anterior.

+1

Ah, sí. Gracias, Erick. StackOverflow realmente necesita un compilador integrado en el panel de respuestas para que podamos probar nuestro código :) –

2

Si conoces a los índices de los elementos que desea eliminar, se pueden quitar en orden inverso, sin tener que preocuparse acerca de los índices cambiantes:

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    int[] indexesToRemove = {0,2,3}; 
    Arrays.sort(indexesToRemove); 
    for (int i=indexesToRemove.length-1; i>=0; i--) { 
     ar1.remove(indexesToRemove[i]); 
    } 
Cuestiones relacionadas