Il existe deux façons de supprimer des objets de ArrayList en Java, d’abord en utilisant la méthode remove() et ensuite en utilisant Iterator. ArrayList fournit la méthode remove() surchargée, un index d’acceptation de l’objet à supprimer, c’est-à-dire remove(int index), et un autre objet d’acceptation à supprimer, c’est-à-dire remove(Object obj). La règle empirique est que Si vous connaissez l’index de l’objet, utilisez la première méthode, sinon utilisez la deuxième méthode. En passant, vous devez vous rappeler d’utiliser les méthodes de suppression ArrayList, uniquement lorsque vous n’itérez pas sur ArrayList si vous itérez, utilisez Iterator.la méthode remove(), à défaut de le faire, peut entraîner une exception ConcurrentModificationException en Java. Un autre problème peut s’être produit en raison de l’autoboxing. Si vous regardez de près que deux méthodes de suppression, remove(int index) et remove (Object obj) sont impossibles à distinguer si vous essayez de supprimer d’une liste d’entiers.
Supposons que vous ayez trois objets dans ArrayList, c’est-à-dire que vous souhaitez supprimer le deuxième objet, qui est 2. Vous pouvez appeler remove(2), qui est en fait un appel à remove(Object) si vous envisagez l’autoboxing, mais sera interprété comme un appel à supprimer le 3ème élément, en interprétant comme remove(index).
J’ai discuté de ce problème plus tôt dans mon article sur les meilleures pratiques à suivre lors de la surcharge des méthodes en Java. En raison de la règle d’élargissement moins connue et de l’autoboxing, une méthode mal surchargée peut créer beaucoup d’ambiguïté.
Exemple de code Pour Supprimer des éléments de ArrayList
Testons la théorie ci-dessus avec un exemple de code simple de ArrayList avec des entiers. Le programme suivant a une liste d’entiers contenant 1, 2 et 3, c’est-à-dire que cela correspond exactement à l’index.
test de paquet; importer java.util.ArrayList; importer java.util.List; /**** @author http://java67.blogspot.com*/ public class JavaTutorial {/*** @param args les arguments de la ligne de commande */ public static void main (String args) { List < Entier > numbers= new ArrayList < Entier >(); nombres.ajouter (1); nombres.ajouter (2); nombres.add(3); Système.hors.println("ArrayList contains:" + numbers); // Appelant des numéros de suppression (index).remove(1); // suppression d'un objet à l'index 1, c'est-à-dire le 2ème objet, qui est 2 // Appelant des numéros de suppression (objet).remove(3); }} Sortie: ArrayList contient: Exception dans le thread "principal" java.lang.IndexOutOfBoundsException: Index:3, Taille:2 à java.util.ArrayList.rangeCheck (ArrayList.java: 635) à java.util.ArrayList.supprimer (ArrayList.java: 474) au test.Test.principal (Test.java: 33) Résultat Java: 1
Vous pouvez voir que le deuxième appel est également traité comme remove (index). La meilleure façon de lever l’ambiguïté est de supprimer l’autoboxing et de fournir un objet réel, comme indiqué ci-dessous.
Système.hors.println("ArrayList Before:" + numbers); // Appelant des numéros de suppression (index).remove(1); // suppression de l'objet à l'index 1, c'est-à-dire le 2ème objet, qui est 2 // Appelant les numéros remove(object).remove(nouvel entier (3)); Système.hors.println("ArrayList After:" + numbers); Output:ArrayList Before:ArrayList After:
Cette fois, cela fonctionne, mais j’ai peur des développeurs paresseux comme moi, ce qui prend l’autoboxing accordé. Jetons maintenant un coup d’œil à la suppression de l’objet de ArrayList lors de leur itération. Vous devez être familier avec Iterator en Java, avant de continuer.
Supprimer un objet de ArrayList en utilisant l’Itérateur
C’est en fait un détail subtil de la programmation Java, pas évident pour les débutants, car le compilateur ne se plaindra pas, même si vous utilisez la méthode remove() de java.util.ArrayList, tout en utilisant l’Itérateur. Vous ne réaliserez votre erreur que lorsque vous verrez ConcurrentModificationException, qui elle-même est trompeuse et vous pouvez passer d’innombrables heures à trouver un autre thread, qui modifie cette ArrayList, à cause du mot concurrent. Voyons un exemple.
public static void main (String args) { List < Entier >numbers= new ArrayList < Entier >(); nombres.ajouter (101); nombres.add (200); nombres.add(301); nombres.add (400); Système.hors.println("ArrayList Avant:" + nombres); Iterator<Integer> itr = numbers.iterator(); // remove all even numbers while (itr.hasNext()) { Integer number = itr.next(); if (number % 2 == 0) { numbers.remove(number); } } System.out.println("ArrayList After : " + numbers); }Output :ArrayList Before : Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831) at Testing.main(Testing.java:28)
Vous pouvez ConcurrentModificationException, en raison de l’appel à la méthode remove() de ArrayList. C’est facile dans des exemples simples comme celui-ci, mais dans un projet réel, cela peut être vraiment difficile. Maintenant, pour corriger cette exception, remplacez simplement l’appel de numéros.remove() à itr.remove(), cela supprimera l’objet actuel que vous itérez, comme indiqué ci-dessous:
Système.hors.println("ArrayList Before:" + numbers); Itérateur < Entier > itr=numbers.iterator(); // supprime tous les nombres pairs pendant (itr.hasNext()) { Nombre entier = itr.prochain(); si (nombre %2 == 0) { itr.remove(); } } Système.hors.println("ArrayList After:" + numbers); OutputArrayList Before:ArrayList After:
C’est tout sur ce post sur la façon de supprimer un objet de ArrayList en Java. Nous avons appris deux façons de supprimer un objet ou un élément de ArrayList. Soit dit en passant, Vous devez toujours utiliser remove(index) pour supprimer l’objet, si vous n’itérez pas, sinon utilisez toujours la méthode remove() de l’Itérateur pour supprimer l’objet de ArrayList. En passant, les conseils ci-dessus fonctionneront avec toute implémentation de liste basée sur un index.
Apprentissage continu
Java En Profondeur: Devenez un Ingénieur Java Complet
Bases de données Java: Collections
Structures de Données et Algorithmes: Plongée en profondeur à l’aide de Java
Algorithmes et Structures de Données – Parties 1 et 2
Structures de données en Java 9 par Heinz Kabutz