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

Java Discussion :

Problème de référence à la sortie d'une méthode


Sujet :

Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Problème de référence à la sortie d'une méthode
    Bonjour,

    J'ai un problème avec une méthode statique qui me permet de trier une liste chainée ( implémentée par moi même, et non de l'API collection ).

    Ce qui se passe, c'est que dans ma liste, j'ai une méthode qui s'appelle par exemple trierParFormes1(), dans cette méthode, j'appelle une méthode statique d'une de mes classes outils qui me sert à trier les listes, donc l'appel se fait comme ceci : TriFouilleListe.trierFormes1(this);

    Une fois à l’intérieur, je suis l'évolution du tri avec le debugger, la liste est bien triée, mais une fois que ça sort de la méthode, ma liste ( this ) redevient à son état initial. Je suis bloqué sur ça depuis plus d'une journée et je n'arrive pas à trouver une solution logique vu que mon algo de tri fonctionne.

    Exemple de code :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    public static void trierFormes2(Liste liste){
            //Travailler avec un clone de la liste pour ne pas interferer avec l'affichage
            Liste listeClone = new Liste();
            listeClone = liste.clone();
            //Liste triée
            Liste listeTriee = new Liste();
     
            listeTriee.dernier();
     
            //Recherche des carrés
            listeClone.premier();
            for(int i=0; i<listeClone.getTaille(); i++){
                AbstractForme forme = (AbstractForme) listeClone.getElement();
                if(forme.toString().equals(Carre.NOM)){
                    listeTriee.insererFin(forme);
                }
                listeClone.suivant();
            }
     
            //Recherche des rectangles
            listeClone.premier();
            for(int i=0; i<listeClone.getTaille(); i++){
                AbstractForme forme = (AbstractForme) listeClone.getElement();
                if(forme.toString().equals(Rectangle.NOM)){
                    listeTriee.insererFin(forme);
                }
                listeClone.suivant();
            }
     
            //Recherche des cercles
            listeClone.premier();
            for(int i=0; i<listeClone.getTaille(); i++){
                AbstractForme forme = (AbstractForme) listeClone.getElement();
                if(forme.toString().equals(Cercle.NOM)){
                    listeTriee.insererFin(forme);
                }
                listeClone.suivant();
            }
     
            //Recherche des ovales
            listeClone.premier();
            for(int i=0; i<listeClone.getTaille(); i++){
                AbstractForme forme = (AbstractForme) listeClone.getElement();
                if(forme.toString().equals(Ovale.NOM)){
                    listeTriee.insererFin(forme);
                }
                listeClone.suivant();
            }
     
            //Recherche des lignes
            listeClone.premier();
            for(int i=0; i<listeClone.getTaille(); i++){
                AbstractForme forme = (AbstractForme) listeClone.getElement();
                if(forme.toString().equals(DemiDroite.NOM)){
                    listeTriee.insererFin(forme);
                }
                listeClone.suivant();
            }
     
            liste = listeTriee.clone();
        }
    J'ai aussi essayé de faire en sorte que la méthode retourne la liste triée, et de faire liste = TriFouilleListe.trierFormes1(liste);
    Mais le résultat est le même, ma liste ne change pas d'état :/

    Merci d'avance

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    En fait la solution serait de faire liste = TriFouilleListe.trierFormes1(liste); dans la 1ere classe ou cette objet liste a été defini ( dans le main dans mon cas ).

    Cependant, ce qui me parait le plus simple, c'est de faire ça en interne dans la propre liste, le seul probleme c'est qu'on ne peut faire this = quelque chose. J'ai fais des recherches, les gens parlent d'utiliser un wrapper etc. mais je ne comprend pas tres bien ce concept de wrapper.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Je vais m'arracher les cheveux !!!!!
    Sachant qu'il n'est apparement pas possible de modifier un objet via sa classe, j'ai juste décider de créer un PropertyChangeListener entre le main ( ou est déclaré ma liste ) et le menu ou est triée ma liste.

    Donc à chaque fois que je clique sur le bouton : trier formes 1, ça communique avec le main pour lui dire de trier la liste. Ainsi toutes les autres listes dans le programme seront triées ( car elle est née dans le main puis passée en paramètre dans les autres classes ).

    ET BEN NON ! ÇA NE FONCTIONNE TOUJOURS PAS ! Je ne comprend plus rien !

    Aidez moi svp, je ne sais meme plus combien d'heures j'ai passé sur ça alors que ça doit surement être une erreur stupide qui m'échappe.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Maintenant je suis passé à une tout autre étape.

    J'ai fait en sorte que ca return une liste triée, et je fais liste = TriFouilleListe.trierForme(liste); dans le main, donc dans l'endroit ou ma liste est née.

    Juste apres le tri, je print ce qu'il y a dans ma liste, ( la liste originale, celle du main ), je la vois triée, je suis content.

    Par contre, dans mon JFrame qui contient ma liste ( passée en paramètre à partir du main ), le paintcomponent affiche toujours l'ancienne liste.

    ( Car en fait je dois trier des formes qui sont dans la liste et qui s'affichent dans le GUI ).

    Une idée ?

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ton problème, c'est que tu travaille sur une copie de la liste (cf tes méthodes clones) et non pas sur la liste d'origine. Donc du coup la liste d'origine n'est pas changée. Faut revoir ton implémentation. Soit la liste est immutable => tes méthodes de tris doivent retourner à l'appelant la nouvelle liste.

    Soit les listes peuvent changer (ce qui me semble logique) => alors il faut modifier la liste d'origine et non pas une copie. Tu oublie donc les clone()

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Je travaille sur une copie, car si je travaille sur l'original, cela va interferer avec le paintcomponent qui affiche mes formes ( car il parcoure la liste avec une boucle qui fait à chaque fois liste.premier(), suivant suivant suivant, liste.premier() etc )

    Mais de toutes façons, maintenant je fais un return, et je print ma liste après avoir fait : liste = trierListe(); ( qui me return une liste triée ), la ''liste'' est bien triée, mais à l'affichage cela ne se voit pas.

    Merci quand même.

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    J'ai du mal à saisir:
    - tu ne veux pas modifier ta liste pour ne pas interférer avec une méthode d'affichage,
    - tu veux que ta liste soit triée.

    Les deux sont contradictoires selon moi, il faut préciser un peu ce point.

    Ensuite, pour que tes changements se voient à l'affichage, il faut que les branchements soient fait correctement. Là, on ne peut pas te dire ce qui ne va pas, on pas le code. Peut être que tes composants d'affichages ne prennent pas bien en compte la nouvelle liste.

    Une solution pour voir le résultat, serait de faire en sorte que ta liste implémente l'interface ListModel. Ensuite, pour ton affichage, tu utilises une JList ou un autre composant (peut-être de ton cru), qui écoute les évènements de ta list via un ListDataListener.

    J'ai souvent recours à une classe qui étends List et ListModel, cela me permet de travailler de manière transparente avec une liste et toute les méthodes utilitaires qui vont avec sans me soucier du rafraichissement des différents composants.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par skini26 Voir le message
    Je travaille sur une copie, car si je travaille sur l'original, cela va interferer avec le paintcomponent qui affiche mes formes ( car il parcoure la liste avec une boucle qui fait à chaque fois liste.premier(), suivant suivant suivant, liste.premier() etc )

    Mais de toutes façons, maintenant je fais un return, et je print ma liste après avoir fait : liste = trierListe(); ( qui me return une liste triée ), la ''liste'' est bien triée, mais à l'affichage cela ne se voit pas.

    Merci quand même.
    Ta variable liste, est-ce que c'est bien un membre d'instance sur lequel travaille directement ton paintcomponent, ou est-ce que c'est une variable locale à laquelle tu affectes initialement la vraie liste? Parce que dans le second cas, la vraie liste affichée se fiche royalement que tu aies réaffecté ta variable locale par liste = trierListe() ...

Discussions similaires

  1. [Débutant] Problème de conversion et retour dans une méthode
    Par darkepsylon dans le forum C#
    Réponses: 3
    Dernier message: 19/01/2015, 13h04
  2. problème lors de l'appel d'une méthode
    Par khadi8 dans le forum Débuter
    Réponses: 6
    Dernier message: 09/04/2013, 07h57
  3. Programme crash à la sortie d'une méthode
    Par rXpCH dans le forum Débuter
    Réponses: 7
    Dernier message: 08/05/2012, 07h42
  4. problème lors de l'appel d'une méthode
    Par sfaxian dans le forum VB.NET
    Réponses: 9
    Dernier message: 10/07/2009, 14h39
  5. Réponses: 3
    Dernier message: 22/02/2007, 20h02

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