web-dev-qa-db-fra.com

Comment supprimer un élément de ArrayList en vérifiant sa valeur?

J'ai ArrayList, à partir duquel je veux supprimer un élément qui a une valeur particulière ...

pour par exemple.

ArrayList<String> a=new ArrayList<String>();
a.add("abcd");
a.add("acbd");
a.add("dbca");

Je sais que nous pouvons itérer sur arraylist et sur la méthode .remove () pour supprimer un élément, mais je ne sais pas comment le faire en itérant. Comment puis-je supprimer un élément qui a la valeur "acbd", c'est-à-dire le deuxième élément?

36
vikas devde

Dans votre cas, il n'est pas nécessaire de parcourir la liste, car vous savez quel objet à supprimer. Vous avez plusieurs options. Tout d'abord, vous pouvez supprimer l'objet par index (donc si vous savez que l'objet est le deuxième élément de la liste):

 a.remove(1);       // indexes are zero-based

Ensuite, vous pouvez supprimer l’occurrence première de votre chaîne:

 a.remove("acbd");  // removes the first String object that is equal to the
                    // String represented by this literal

Ou, supprimez toutes les chaînes avec une certaine valeur:

 while(a.remove("acbd")) {}

C'est un peu plus compliqué, si vous avez des objets plus complexes dans votre collection et que vous souhaitez supprimer des instances, qui ont une certaine propriété. Pour que vous ne puissiez pas les supprimer en utilisant remove avec un objet égal à celui que vous souhaitez supprimer.

Dans ce cas, j'utilise généralement une seconde liste pour collecter toutes les instances que je souhaite supprimer et les supprimer en une seconde fois:

 List<MyBean> deleteCandidates = new ArrayList<>();
 List<MyBean> myBeans = getThemFromSomewhere();

 // Pass 1 - collect delete candidates
 for (MyBean myBean : myBeans) {
    if (shallBeDeleted(myBean)) {
       deleteCandidates.add(myBean);
    }
 }

 // Pass 2 - delete
 for (MyBean deleteCandidate : deleteCandidates) {
    myBeans.remove(deleteCandidate);
 }
54
Andreas_D

One-Liner (Java8):

list.removeIf(s -> s.equals("acbd")); // removes all instances, not just the 1st one

(fait toutes les itérations implicitement)

21
Andrejs

Vous devez utiliser un Iterator comme ceci:

Iterator<String> iterator = a.iterator();
while(iterator.hasNext())
{
    String value = iterator.next();
    if ("abcd".equals(value))
    {
        iterator.remove();
        break;
    }
}

Ceci étant dit, vous pouvez utiliser les remove (int index) ou remove (Object obj) qui sont fournis par la classe ArrayList . Notez cependant que l'appel de ces méthodes pendant que vous effectuez une itération sur la boucle entraînera une exception ConcurrentModificationException , de sorte que cela ne fonctionnera pas:

for(String str : a)
{
    if (str.equals("acbd")
    {
        a.remove("abcd");
        break;
    }
}

Mais cela va (puisque vous ne parcourez pas le contenu de la boucle):

a.remove("acbd");

Si vous avez des objets plus complexes, vous devrez redéfinir la méthode égal .

11
npinti

Vous devriez vérifier API pour ces questions.

Vous pouvez utiliser les méthodes remove .

a.remove(1);

OR

a.remove("acbd");
3
Azodious

Cela vous donnera la sortie,

    ArrayList<String> l= new ArrayList<String>();

    String[] str={"16","b","c","d","e","16","f","g","16","b"};
    ArrayList<String> tempList= new ArrayList<String>();

    for(String s:str){
        l.add(s);
    }

    ArrayList<String> duplicates= new ArrayList<String>();

    for (String dupWord : l) {
        if (!tempList.contains(dupWord)) {
            tempList.add(dupWord);
        }else{
            duplicates.add(dupWord);
        }
    }

    for(String check : duplicates){
        if(tempList.contains(check)){
            tempList.remove(check);
        }
    }

    System.out.println(tempList);

sortie,

[c, d, e, f, g]
1
AnjuT

Il suffit d'utiliser myList.remove(myObject).

Il utilise la méthode equals de la classe. Voir http://docs.Oracle.com/javase/6/docs/api/Java/util/List.html#remove (Java.lang.Object )

BTW, si vous avez des choses plus complexes à faire, vous devriez jeter un coup d'œil à la bibliothèque de goyaves qui a des dizaines d'utilitaires pour le faire avec des prédicats, etc.

1
poussma

L'extrait permettant de supprimer un élément de toute liste en fonction de la condition d'appariement est le suivant:

List<String> nameList = new ArrayList<>();
        nameList.add("Arafath");
        nameList.add("Anjani");
        nameList.add("Rakesh");

Iterator<String> myItr = nameList.iterator();

    while (myItr.hasNext()) {
        String name = myItr.next();
        System.out.println("Next name is: " + name);
        if (name.equalsIgnoreCase("rakesh")) {
            myItr.remove();
        }
    }
0
Arafath

Essayez ci-dessous le code:

 public static void main(String[] args) throws Exception{
     List<String> l = new ArrayList<String>();
     l.add("abc");
     l.add("xyz");
     l.add("test");
     l.add("test123");
     System.out.println(l);
     List<String> dl = new ArrayList<String>();
    for (int i = 0; i < l.size(); i++) {
         String a = l.get(i);
         System.out.println(a); 
         if(a.equals("test")){
             dl.add(a);
         }
    }
    l.removeAll(dl);
     System.out.println(l); 
}

votre sortie:

 [abc, xyz, test, test123]
abc
xyz
test
test123
[abc, xyz, test123]
0
Nitin Vavdiya

utilisez la méthode contains () disponible dans list interface pour vérifier si la valeur existe ou non dans list. Si elle contient cet élément, obtenez son index et supprimez-le.

0
Renjith

Utilisez un itérateur pour parcourir la liste, puis supprimez l'objet requis.

    Iterator itr = a.iterator();
    while(itr.hasNext()){
        if(itr.next().equals("acbd"))
            itr.remove();
    }
0
rai.skumar