Eliminar elemento de ArrayList


100

Tengo una ArrayListsupongamos list, y tiene 8 artículos AH y ahora quiero eliminar 1,3,5 posición de artículos almacenados en int matriz de la listforma en que puedo hacer esto.

Estoy tratando de hacer esto con

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

Pero después de que se cambia el primer elemento eliminado, la posición de la matriz y en la siguiente iteración elimina el elemento incorrecto o da una excepción.


¿Qué tal eliminarlo en orden descendente de índices (ordenar los índices y luego eliminar primero el elemento con el índice más alto)?
nhahtdh

1
Tu lógica es defectuosa. Seguramente no deberías pensar en la posición de cada elemento, sino en los elementos en sí. En otras palabras, usted no desea eliminar las posiciones 1, 3 y 5, pero por el contrario desea eliminar los elementos (dondequiera que se encuentren en el List) usando equals("B"), equals("D")y equals("F"). Piénsalo.
Squonk

Sí, quiero eliminar el artículo, pero ¿cómo puedo hacer coincidir los artículos? En realidad, estos elementos están en ListView y, en la selección, quiero eliminar esto de DB y Array y actualizar el adaptador y List
Krishnakant Dalal

Opción lenta: iterar una vez agregando los elementos a una segunda lista, iterar la segunda lista eliminando de la primera (paso opcional: devolver la segunda lista a la persona que llama)
SparK

Respuestas:


134

En este caso específico , debe eliminar los elementos en orden descendente. Primero índice 5, luego 3, luego 1. Esto eliminará los elementos de la lista sin efectos secundarios indeseables.

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
ArrayList del OP contiene Strings, no Integers (sin embargo, estoy de acuerdo con su observación).
Alex Lockwood

@Alex: Esta respuesta funcionará, pero es tan defectuosa como la lógica del OP en su pregunta. Estamos hablando de ArrayList<E>: ¿por qué alguien querría eliminar un objeto de una posición ArrayListbasada puramente en en lugar de probar lo que está en esa posición? Es posible que el OP se esté utilizando Stringcomo tipo de objeto para el, ArrayListpero su respuesta es una práctica de codificación realmente mala para los genéricos, incluso si resuelve la situación particular del OP.
Squonk

3
Sí estoy de acuerdo con usted. Pero el OP preguntó sobre ArrayList<String>, no ArrayList<E>.
Adrian Monk

Estoy completamente en desacuerdo con esta respuesta, @MisterSquonk ya está convencido, la solución debe ser genérica. Además, ¿por qué estoy recibiendo un voto negativo?
Mohammed Azharuddin Shaikh

66
Bien, escucha ... No sé cuál es el problema. El OP publicó su código y respondí con una respuesta que ilustraba una posible solución. Lamento no haber ido más allá al dar una solución completamente general ... pero por lo que puedo decir, el OP no estaba pidiendo una lección de programación. Estaba preguntando "¿por qué no funciona este código?" No empiece a culparme por rechazar su respuesta solo porque interpretó la pregunta de manera diferente.
Alex Lockwood

30

Puede eliminar elementos de ArrayList uso ListIterator,

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

Es mejor y una buena práctica utilizar el método remove () de ListIterator para eliminar objetos de la colección en Java, porque puede haber la posibilidad de que otro hilo esté modificando la misma colección y podría conducir a ConcurrentModificationException.
Min2

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

Como se mencionó anteriormente

iterator.remove()

es quizás la única forma segura de eliminar elementos de la lista durante el ciclo.

Para una comprensión más profunda de la eliminación de elementos usando el iterador, intente mirar este hilo


Estoy aturdido sin votos a favor, estoy totalmente de acuerdo contigo. Ésta es la forma más segura de hacerlo.
Simmant

3

Supongo que la matriz i está ordenada en ascenso, aquí hay otra solución con Iterator, es más genérica:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

¿Qué tal esto? Solo dale un pensamiento

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

Y la salida fue-

[A, C, E, G, H]

2

Pruébalo de esta manera

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}

2
String[] mString = new String[] {"B", "D", "F"};

for (int j = 0; j < mString.length-1; j++) {
        List_Of_Array.remove(mString[j]);
}

2

Si usa "=", se crea una réplica para la lista de matrices original en la segunda, pero la referencia es la misma, por lo que si cambia en una lista, la otra también se modificará. Use esto en lugar de "="

        List_Of_Array1.addAll(List_Of_Array);

2

El método remove (int index) de arraylist elimina el elemento en la posición especificada (índice) en la lista. Después de eliminar los elementos de la lista de arrays, los elementos posteriores se desplazan hacia la izquierda.

Significa que si una lista de arrays contiene {20,15,30,40}

He llamado al método: arraylist.remove (1)

luego los datos 15 se eliminarán y 30 y 40 estos dos elementos se dejarán desplazados en 1.

Por esta razón, primero debe eliminar el elemento de índice más alto de la lista de matrices.

Entonces ... para su situación dada ... el código será ...

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.