Rimuovi elemento da ArrayList


100

Ho una ArrayListsupposizione list, e ha 8 elementi AH e ora voglio eliminare 1,3,5 posizione Item memorizzata nell'array int da listcome posso farlo.

Sto cercando di farlo 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]);
}

Ma dopo che il primo elemento cancellato posizionato dell'array è cambiato e nell'iterazione successiva elimina l'elemento sbagliato o fa eccezione.


Che ne dici di rimuoverlo in ordine decrescente di indici (ordinare gli indici, quindi rimuovere prima l'elemento con l'indice più alto)?
nhahtdh

1
La tua logica è viziata. Sicuramente non dovresti pensare alla posizione di ogni oggetto ma pensare invece agli oggetti stessi. In altre parole, non si desidera rimuovere le posizioni 1, 3 e 5, ma invece si desidera rimuovere gli elementi (ovunque si trovino nel List) utilizzando equals("B"), equals("D")e equals("F"). Pensaci.
Squonk

Sì, desidero eliminare l'elemento, ma come posso abbinare gli elementi. In realtà in realtà questi elementi sono in ListView e su selezionare voglio eliminarlo da DB e Array e aggiornare l'adattatore e List
Krishnakant Dalal

Opzione lenta: iterare una volta aggiungendo gli elementi a un secondo elenco, iterare il secondo elenco rimuovendo dal primo (passaggio facoltativo: restituire il secondo elenco al chiamante)
SparK

Risposte:


134

In questo caso specifico , dovresti rimuovere gli elementi in ordine decrescente. Prima indice 5, poi 3, poi 1. Ciò rimuoverà gli elementi dall'elenco senza effetti collaterali indesiderati.

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

1
ArrayList dell'OP contiene Strings, non Integers (tuttavia, sono d'accordo con la tua osservazione).
Alex Lockwood

@Alex: questa risposta funzionerà ma è difettosa quanto la logica dell'OP nella loro domanda. Stiamo parlando di ArrayList<E>: perché qualcuno dovrebbe voler rimuovere un oggetto da una posizione ArrayListbasata esclusivamente sulla posizione invece di testare cosa c'è in quella posizione? L'OP potrebbe anche essere utilizzato Stringcome tipo di oggetto per l' OP, ArrayListma la tua risposta è davvero pessima pratica di codifica per i generici anche se risolve la situazione particolare dell'OP.
Squonk

3
Si sono d'accordo con te. Ma l'OP ha chiesto ArrayList<String>, no ArrayList<E>.
Adrian Monk

Sono completamente in disaccordo con questa risposta, @MisterSquonk sei convinto, la soluzione deve essere generica. Inoltre, perché sto ottenendo un voto negativo?
Mohammed Azharuddin Shaikh,

66
OK, ascolta ... non so quale sia il grosso problema. L'OP ha pubblicato il suo codice e io ho risposto con una risposta che illustrava una possibile soluzione. Mi dispiace di non essere andato oltre dando una soluzione completamente generale ... ma per quanto ne so, l'OP non stava chiedendo una lezione di programmazione. Stava chiedendo "perché questo codice non funziona?" Non iniziare a biasimarmi per aver votato contro la tua risposta solo perché hai interpretato la domanda in modo diverso.
Alex Lockwood

30

Puoi rimuovere elementi ArrayListdall'utilizzo 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

È meglio e buona pratica utilizzare il metodo ListIterator remove () per rimuovere oggetti da Collection in Java, perché potrebbe esserci la possibilità che un altro thread stia modificando la stessa raccolta e potrebbe portare 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

Come menzionato prima

iterator.remove()

è forse l'unico modo sicuro per rimuovere gli elementi dell'elenco durante il ciclo.

Per una comprensione più approfondita della rimozione degli elementi utilizzando l'iteratore, prova a guardare questo thread


Non ho voti positivi, sono totalmente d'accordo con te. Questo è il modo più sicuro per farlo.
Simmant

3

Presumo che l'array i sia ordinato in ordine ascendente, ecco un'altra soluzione con Iterator, è più generica:

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

Cosa ne pensi di questo? Provaci solo

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);

        }


}

E l'output è stato-

[A, C, E, G, H]

2

Provalo in questo modo

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

Se usi "=", viene creata una replica per l'arraylist originale nel secondo, ma il riferimento è lo stesso, quindi se cambi in un elenco, anche l'altro verrà modificato. Usa questo invece di "="

        List_Of_Array1.addAll(List_Of_Array);

2

Il metodo remove (int index) di arraylist rimuove l'elemento nella posizione specificata (index) nell'elenco. Dopo aver rimosso gli elementi dell'elenco di array, tutti gli elementi successivi vengono spostati a sinistra.

Significa che un elenco di elenchi contiene {20,15,30,40}

Ho chiamato il metodo: arraylist.remove (1)

quindi i dati 15 verranno cancellati e 30 e 40 questi due elementi verranno lasciati spostati di 1.

Per questo motivo è necessario eliminare prima l'elemento di indice più alto dell'elenco di array.

Quindi ... per la tua situazione ... il codice sarà ..

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]);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.