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

Collection et Stream Java Discussion :

Probleme d'iterator - LinkedList


Sujet :

Collection et Stream Java

  1. #1
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut Probleme d'iterator - LinkedList
    Bonjour,

    Je code pour le moment une stucture objet de maillage "dynamique".

    Ainsi voila les les elements de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class vertex {
     
    	private Point3f X;	//coordonnées
    	private int id;		//identifiant/numéro
    	private LinkedList<edge> edges;	//liste de references vers les arretes
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class edge {
     
    	private int id;	//identifiant/numero
    	private vertex[] vertices;	//tableau de 2 vertex
    	private face[] faces;		//tableau de 2 faces
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class face {
     
    	private int id;
    	private edge[] edges;
    }
    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
     
    public class maillage {
     
     
    	/** Boite englobante */
    	private float Xmin;
    	private float Xmax;
    	private float Ymin;
    	private float Ymax;
    	private float Zmin;
    	private float Zmax;
     
    	/** elements composant le maillage */
    	private LinkedList<face> faces;
    	private LinkedList<edge> edges;
    	private LinkedList<vertex> vertices;
    ...
    }
    Voila en gros.

    Pour tester mes méthodes, j'ai fait un main() :
    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
     
    public static void main(String[] args) {
     
    		System.out.println("Program started");
     
    		maillage m = new maillage();
     
    		m.build(); //consturction du maillage de test
     
    		ListIterator it = m.getVertices().listIterator();
    		vertex test = new vertex((float)0.0, (float)0.0, (float)0.0);
     
    		while(it.hasNext())
    		{
     
    			vertex tt = (vertex)it;
    			float[] data = tt.getCoord();
    			System.out.println("Test X:"+data[0]+" "+data[1]+" "+data[2]+"");
     
    			if(it.equals(test))
    			{
    				System.out.println("	Trouvé");
    			}
    			it.next();
    			System.out.println("	next");
    		}
     
    		System.out.println("Program terminated");
    	}
    Seulement voila, je ne connais rien aux itérateurs, et donc le probleme vien du fait que je en sais pas comment récuperer la reference de mon objet dans ma liste, car l'itérateur la parcours mais n'a pas de méthode pour récuperer le contenu de l'element courant...

    Ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Program started
    Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList$ListItr
    	at maillage_main.main(maillage_main.java:20)
     
    (la ligne 20 étant "vertex tt = (vertex)it;" )
    j'ai regardé la FAQ mais je n'ai rien trouvé de concluant...

    Merci de m'aider....

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Et "it.next();" te renvoie quoi, à ton avis?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(it.hasNext()) {
       vertex tt = (vertex) it.next();
       // etc.
    }
    Bien évidemment un seul "it.next();" est autorisé par boucle (en général au début pour récupérer l'objet courant)
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Sinon, je n'avais pas remarqué mais tu ne respectes pas les conventions de nommage des variables en java (qui est d'ailleurs la même dans la plupart des langages objets)

    Un nom de classe commence par une majuscule:
    vertex tt = ... doit devenir Vertex tt = ...

    Inversement, les noms de variables commencent par des minuscules
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Donc si je comprend bien, le it.next(), non seulement retourne l'objet courant, mais en plus passe au suivant c'est bien ça ?

    Et pour les conventions de nommage, j'ai été un peu laxiste, mais rien n'est encore perdu

    merci

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par Ange_blond
    Donc si je comprend bien, le it.next(), non seulement retourne l'objet courant, mais en plus passe au suivant c'est bien ça ?
    Oui... ou plutôt l'inverse: il renvoie le prochain élément de l'itérateur. C'est pour cela que cette méthode ne peut être invoquée QUE si l'itérateur a un prochain élément (donc si hasNext() renvoie true).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    List test = new LinkedList();
    test.add("a");
    test.add("b");
    test.add("c");
     
    Iterator i = test.iterator();
    while(i.hasNext()) {
       System.out.println(i.next().toString());
    }
     
    // Dans la console, on voit naturellement s'afficher "a", "b", et "c"
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  6. #6
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Whaaaou merci à toi

    je regarde ça dans 10 minutes à la fin de mon épisode de Friends

    encore merci

  7. #7
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Heuu une petite question quand meme :
    Je souhaite supprimer un element de la liste, et pour le moment je le fait de cette maniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ListIterator li = this.edges.listIterator();
    while (li.hasNext())
    {
    	if(this.equals((vertex)li.next()))
    	{
    		li.remove();
    	}
     
    }
    Le gros doute réside dans le fait que je soit en train de supprimer l'element courant, ou le suivant...

    merci

  8. #8
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    La méthode remove() d'un itérateur supprime le dernier objet récupéré par la méthode next(). Donc c'est bien l'objet récupéré deux lignes plus haut que tu supprimes de ta liste.

    Cependant, tu te compliques la vie... si tu n'as pas remarqué, l'interface List possède une méthode remove(Object) qui effectue exactement le traitement que tu es en train de reprogrammer (c'est du moins le cas dans les classes implémentant cette interface fournies par Sun: ArrayList, LinkedList...)

    Donc tu peux remplacer ta boucle par un simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List maList = uneInstanceDeListe;
     
    // suppesion tous les objets obj de la liste qui vérifient "obj.equals(this)"
    maList.remove(this);
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  9. #9
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    heuu non justement car je me sert de THIS comme reference pour comparer avec un element de la liste que je supprime par la suite... donc THIS reste intact...

    en tout cas merci beaucoup pour les coups de main

  10. #10
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par Ange_blond
    heuu non justement car je me sert de THIS comme reference pour comparer avec un element de la liste que je supprime par la suite... donc THIS reste intact...
    Permet-moi de ne pas comprendre ce que tu veux dire... La méthode remove(this) appliquée à une liste ne modifie pas l'objet courant "this". Elle supprime de ta liste les références de l'objet courant "this", mais cet objet continue d'exister (et n'est pas modifié) si tu as besoin d'en faire autre chose.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  11. #11
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    haaa ok je vois ce que tu veux dire.

    En effet ma boucle peut etre un peu allegée via cette manip' là...

    (je me coucherai encore une fois moin bête ce soir )

    Merci ô CyberChouan, dieu des LinkedList

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

Discussions similaires

  1. Probleme map iterator
    Par Veovis dans le forum SL & STL
    Réponses: 2
    Dernier message: 02/06/2008, 22h08
  2. Probleme interface iterator dans une ArrayList
    Par inzagi dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 25/02/2008, 19h05
  3. probleme avec une linkedlist
    Par christianf dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 24/09/2007, 17h42
  4. probleme avec LinkedList
    Par habouch dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2006, 10h12
  5. [Struts][logic:iterate] Probleme avec String
    Par julienOriano dans le forum Struts 1
    Réponses: 7
    Dernier message: 15/06/2004, 09h39

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