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.

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

    }
}

la source
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

shimon001
la source
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++;
}
DàChún
la source
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]
sgowd
la source
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]);
}
Khan
la source
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
la source
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);
Rahul Gupta
la source
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]);
}
Avijit Karmakar
la source