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.

Krishnakant Dalal
fuente
¿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]);
}
Alex Lockwood
fuente
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
Jainendra
fuente
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);

    }
}

fuente
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

shimon001
fuente
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++;
}
DàChún
fuente
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]
sgowd
fuente
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]);
}
Kan
fuente
2
String[] mString = new String[] {"B", "D", "F"};

for (int j = 0; j < mString.length-1; j++) {
        List_Of_Array.remove(mString[j]);
}
Mohammed Azharuddin Shaikh
fuente
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);
Rahul Gupta
fuente
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]);
}
Avijit Karmakar
fuente