Supprimer l'élément de ArrayList


100

J'ai un ArrayListsupposé list, et il a 8 éléments AH et maintenant je veux supprimer l'élément 1,3,5 position stocké dans le tableau int du listcomment puis-je faire cela.

J'essaye de faire ça avec

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

Mais après le premier élément supprimé, la position du tableau est modifiée et dans l'itération suivante, elle supprime le mauvais élément ou donne une exception.


Que diriez-vous de le supprimer dans l'ordre décroissant des indices (trier les indices, puis supprimer d'abord l'élément avec l'index le plus élevé)?
nhahtdh

1
Votre logique est imparfaite. Vous ne devriez sûrement pas penser à la position de chaque élément, mais plutôt penser aux éléments eux-mêmes. En d'autres termes, vous ne souhaitez pas supprimer les positions 1, 3 et 5, mais vous souhaitez plutôt supprimer les éléments (où qu'ils se trouvent dans List) à l'aide de equals("B"), equals("D")et equals("F"). Pensez-y.
Squonk

Oui, je souhaite supprimer l'élément, mais comment puis-je faire correspondre les éléments. En fait, en réalité, ces éléments sont dans ListView et sur sélectionnez Je veux supprimer cela de DB et Array et actualiser l'adaptateur et la liste
Krishnakant Dalal

Option lente: itérer une fois en ajoutant les éléments à une deuxième liste, itérer la deuxième liste en supprimant de la première (étape facultative: renvoyer la deuxième liste à l'appelant)
SparK

Réponses:


134

Dans ce cas précis , vous devez supprimer les éléments par ordre décroissant. Premier indice 5, puis 3, ensuite 1. Cela supprimera les éléments de la liste sans effets secondaires indésirables.

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

1
La ArrayList de l'OP contient des Strings, pas des Integers (néanmoins, je suis d'accord avec votre observation).
Alex Lockwood

@Alex: Cette réponse fonctionnera mais elle est aussi imparfaite que la logique du PO dans leur question. Nous parlons de ArrayList<E>- pourquoi quelqu'un voudrait-il supprimer un objet d'une ArrayListposition uniquement basée sur la position au lieu de tester ce qui se trouve à cette position? L'OP peut bien être utilisé Stringcomme type d'objet pour le ArrayListmais votre réponse est une très mauvaise pratique de codage pour les génériques, même si cela résout la situation particulière de l'OP.
Squonk

3
Oui je suis d'accord avec toi. Mais le PO a posé des questions ArrayList<String>, non ArrayList<E>.
Adrian Monk

Je suis complètement en désaccord avec cette réponse, @MisterSquonk vous êtes convaincu, la solution doit être générique. De plus, pourquoi je reçois un vote négatif?
Mohammed Azharuddin Shaikh

66
OK, écoutez ... Je ne sais pas quel est le problème. L'OP a posté son code et j'ai répondu avec une réponse illustrant une solution possible. Je suis désolé de ne pas être allé au-delà en donnant une solution complètement générale ... mais pour autant que je sache, l'OP ne demandait pas de leçon de programmation. Il demandait "pourquoi ce code ne fonctionne pas?" Ne commencez pas à me reprocher d'avoir voté contre votre réponse simplement parce que vous avez interprété la question différemment.
Alex Lockwood

30

Vous pouvez supprimer des éléments de l' ArrayListutilisation 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

Il est préférable d'utiliser la méthode ListIterator remove () pour supprimer des objets de Collection en Java, car il peut y avoir un risque qu'un autre thread modifie la même collection et pourrait conduire à 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

Comme indiqué précédemment

iterator.remove()

est peut-être le seul moyen sûr de supprimer des éléments de liste pendant la boucle.

Pour une compréhension plus approfondie de la suppression d'éléments à l'aide de l'itérateur, essayez de consulter ce fil


Je suis étonné de ne pas voter, je suis totalement d'accord avec vous. C'est le moyen le plus sûr de le faire.
Simmant

3

Je suppose que le tableau i est trié par ordre croissant, voici une autre solution avec Iterator, elle est plus générique:

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

Que dis-tu de ça? Pensez-y juste-

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

        }


}

Et le résultat était-

[A, C, E, G, H]

2

Essayez-le de cette façon,

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 vous utilisez "=", une réplique est créée pour l'arraylist d'origine dans la seconde liste, mais la référence est la même donc si vous changez dans une liste, l'autre sera également modifiée. Utilisez ceci au lieu de "="

        List_Of_Array1.addAll(List_Of_Array);

2

remove (int index) méthode de arraylist supprime l'élément à la position spécifiée (index) dans la liste. Après avoir supprimé les éléments de la liste de lecture, les éléments suivants sont décalés vers la gauche.

Signifie si une arraylist contient {20,15,30,40}

J'ai appelé la méthode: arraylist.remove (1)

alors les données 15 seront supprimées et 30 & 40 ces deux éléments seront décalés à gauche de 1.

Pour cette raison, vous devez d'abord supprimer l'élément d'index supérieur de l'arraylist.

Donc ... pour votre situation donnée ... le code sera ..

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]);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.