IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Parcours de liste avec suppression d'éléments


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 50
    Points
    50
    Par défaut Parcours de liste avec suppression d'éléments
    Bonjour,

    J'ai pour le moment une ArrayList d'objets (appelons là List) que je souhaite parcourir.

    Lors du parcous de List, si l'objet en cours répond à un certain critère, je souhaite le supprimer de List.

    C'est là qu'est mon problème, comment faire au mieux ?

    Mon pb est que si je créé une belle boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(Objet o : List) if test(o) List.remove(o);
    ça plante dès la 1ère suppression car j'ai pas le droit de modifier List alors que ma boucle For est basée dessus.

    Du coup, j'ai testé 2 choses qui fontionnent mais que je ne trouve pas très optimisées...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    boolean[] toDelete = new boolean[List.size()];
    int nbDeletedObject=0;
    int j=0;
    for(Objet o: List){
        toDelete[j]=false;
        if(test(o)){
            toDelete[j]=true;
            nbDeletedObject++;
        }
        j++;
    }
    if(nbDeletedObject!= 0)
        for(int i=List.size()-1; i>=0; i--)
            if(toDelete[i])
                List.remove(i);
    Inconvénient : 2 boucles for pour parcourir List

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        for(int i=List.size()-1; i>0; i--){
    	Object o= List.get(i);
    	if(test(o))
    	    List.remove(o);
        }
    Inconvénient : get(i) surtout que i décroît...

    Conclusion, je pense qu'il faudrait que List soit une liste chaînée que je puisse parcourir "proprement" du dernier au premier élément, mais je vois pas quelle structure utiliser pour ça (LinkedList ne semble pas répondre à mes attentes) ?

    Là, j'ai plus les idées claires si vous avez des propositions (même s'il faut changer le type de ma liste, je ne suis pas attaché à ArrayList plus que ça ) je suis preneur.

    Merci à vous !

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Il suffit d'utiliser directement l'iterator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Iterator<Object> iterator = list.iterator();
    while ( iterator.hasNext() ) {
        Object o = iterator.next();
        if (test(o)) {
            // On supprime l'élément courant de la liste
            iterator.remove();
        }
    }
    a++

  3. #3
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 50
    Points
    50
    Par défaut
    Merci adiGuba,

    Je ne connaissais pas cette subtilité d'iterator...

    Je savais l'utiliser de manière propre et cachée dans mon premier for-each et je ne comprenais pas pourquoi cela ne fonctionnait pas...

    Je ne savais pas qu'il y avait un lien aussi imbriqué entre List et son iterator et que l'on pouvait et même devait appliquer la méthode remove() directement sur l'objet iterator...

    Bref, merci beaucoup pour cette réponse !

    En espérant que ce post servira à d'autres...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcours des listes avec iterateurs
    Par ahmadou_20 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/09/2014, 09h29
  2. Liste d'éléments li avec suppression dynamique
    Par leom4t dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/02/2010, 23h42
  3. Réponses: 5
    Dernier message: 11/06/2007, 13h23
  4. Suppression d' éléments dans une liste.
    Par conan76 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/03/2007, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo