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 :

Suppression d'un élément de liste différent de l'itérateur


Sujet :

Langage Java

  1. #1
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut Suppression d'un élément de liste différent de l'itérateur
    Bon, le titre est un peu bof.

    Mon problème :
    Je fais une boucle sur les éléments d'une liste avec un itérateur. Ces éléments peuvent éventuellement être supprimé de la liste, d'où l'intérêt de l'itérateur.
    Bon maintenant, admettons que pour un élément donné je détermine la suppression d'un autre élément de la même liste, y a-t-il un moyen propre de faire ça ?
    Car mon itérateur est le seul moyen de supprimer un élément dans la liste sans déclencher une ConcurrentModificationException.

    La solution qui me vient à l'esprit est de ne pas utiliser d'itérateur et boucler avec un indice et gérer moi-même les effets de bords lors de suppression

    Me goure-je ?
    Votre avis ?

  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,


    Quel est le type exact de la liste ?
    Comment fais tu pour déterminer qu'un élément donné doive supprimé un autre élément ?

    a++

  3. #3
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Salut

    Ma liste est de type List

    Et le critère peut être très variable puisque je suis dans une classe abstraite. En fait je code un framework où j'ai une liste d'individu sur lesquels j'effectue un traitement individuel. Et ce traitement peut déclencher (selon des critères variables) des actions genre suppression d'un individu de la liste.

  4. #4
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Bon je vais illustrer par un exemple, ce sera plus parlant ...
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    public class Removes {
     
    	static class Individu {
    		double value;
    		public Individu(double value) {
    			this.value = value;
    		}
    		@Override
    		public String toString() {
    			return ""+value;
    		}
    	}
    	static class MaListe {
    		List<Individu> individus;
    		public MaListe(List<Individu> l1) {
    			this.individus = l1;
    		}
     
    		public void boucle(Traitement traitement) {
    			for (ListIterator<Individu> it=individus.listIterator(); it.hasNext();) {
    				traitement.faire(it, it.next(), individus);
    			}
    		}
    	}
     
    	static abstract class Traitement {
    		public abstract void faire(ListIterator<Individu> it, Individu ind, List<Individu> liste);
    	}
     
    	static class UnTraitement extends Traitement {
    		@Override
    		public void faire(ListIterator<Individu> it, Individu ind, List<Individu> liste) {
    			if (ind.value == 0.42) 
    				; // TODO supprimer l'élément avant et celui après
    			else if (ind.value == 0)
    				it.remove();
    		}		
    	}
     
    	static void test() {
    		Individu[] individus = {new Individu(0.2),new Individu(0),new Individu(0.9),new Individu(0.42),new Individu(0.5),new Individu(0.8)};
    		MaListe maListe = new MaListe(new ArrayList<Individu>(Arrays.asList(individus)));
    		maListe.boucle(new UnTraitement());
    		System.out.println(maListe.individus);
    	}
    	public static void main(String[] args) {
    		test();
    	}
    }
    Donc, voilà une liste d'individus (MaListe) avec une méthode pour effectuer un traitement en boucle. Et une implémentation de traitement dans lequel je veux supprimer de la liste les deux éléments périphérique si une condition est vrai. Y a-t-il un moyen de le faire comme ça facilement ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Une solution sure consiste a passer par une liste qui contient les elements a supprimer, que tu remplis au fur et a mesure. Et a la fin du traitement, tu retires cette liste à la liste individus.

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ; // TODO supprimer l'élément avant et celui après
    C'est surtout ca que je voulais savoir

    Avec une List tu peux utiliser un ListIterator qui permet un parcours dans les deux sens...

    a++

  7. #7
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par Sanguko
    Une solution sure consiste a passer par une liste qui contient les elements a supprimer, que tu remplis au fur et a mesure. Et a la fin du traitement, tu retires cette liste à la liste individus.
    J'y ai pensé, mais le problème est que les individus supprimer ne doivent pas être pris en compte dans le reste de la boucle. Donc ça implique de regarder à chaque itération, si l'élément pointé n'est pas dans la liste des éléments à supprimer.

  8. #8
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par adiGuba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ; // TODO supprimer l'élément avant et celui après
    C'est surtout ca que je voulais savoir

    Avec une List tu peux utiliser un ListIterator qui permet un parcours dans les deux sens...

    a++
    Oui, mais ce n'est qu'un exemple. Ce peut être aussi supprimer les éléments dont la valeur d'un attribut est inférieur à celle de l'élément en cours (autre exemple).

    Mais en fait, est-ce que je ne peux pas créer un second itérateur sur ma liste qui se chargera des suppressions ? Vais tenter ça ...

  9. #9
    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
    Citation Envoyé par bobuse
    Mais en fait, est-ce que je ne peux pas créer un second itérateur sur ma liste qui se chargera des suppressions ? Vais tenter ça ...
    Non : cela te génèrera une ConcurrentModificationException.

    Le plus simple serait de travailler sur une copie de la liste...

    a++

  10. #10
    Membre actif
    Avatar de bobuse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 232
    Points : 278
    Points
    278
    Par défaut
    OK, et bien merci de tous vos conseils, je vais voir comment me débrouiller avec tout ça

    Merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/05/2009, 20h20
  2. Suppression automatique éléments de liste
    Par Kyoku_FK dans le forum SharePoint
    Réponses: 3
    Dernier message: 28/04/2009, 15h44
  3. Suppression d'un élément d'une list
    Par SimOOn dans le forum SL & STL
    Réponses: 15
    Dernier message: 16/01/2008, 21h18
  4. Réponses: 8
    Dernier message: 01/04/2006, 10h10
  5. Suppression élément dans liste
    Par bugmenot dans le forum C
    Réponses: 12
    Dernier message: 06/12/2005, 19h52

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