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 :

Mode de passage des paramètres en java


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 32
    Points : 30
    Points
    30
    Par défaut Mode de passage des paramètres en java
    Bonjour tout le monde,
    je suis un peu étonné devant un petit problème en java, sachant que ça fait très longtepmpe que je développe à l'aide de ce langage.
    en effet, je voudrais créer un arbre binaire de recherche.
    ci dessous le code source

    Objet Noeud qui représente chaque noeud de larbre
    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 Noeud implements Comparable {
    	private String mot=null;
    	private int nbrOccurence;
    	private int priorite;
        private Noeud LeftNoeud;
        private Noeud RightNoeud;
     
        public Noeud(){	}
     
       public Noeud(String mot, int nbrOccurence, int priorite){
    	this.mot=mot;
    	this.nbrOccurence=nbrOccurence;
    	this.priorite=priorite;
        this.LeftNoeud=null;
        this.RightNoeud=null;
    	}
    ......
    Objet Index qui représente la racine de l'arbre
    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
     
    public class Index {
        public Noeud Racine;
     
        public Index()
        {
        }
     
        public void addWord(String mot)
        {
                mot=mot.toLowerCase();
                Noeud noeud=new Noeud(mot,1,0);
                addWord(Racine, noeud);
        }
        private boolean addWord(Noeud Dic,Noeud noeud)
        {
            if(Dic==null)
            {
                Dic=noeud;
                return true;
            }
            if(Dic.getMot().compareTo(noeud.getMot())==0)
            {
                Dic.setNbrOccurence(Dic.getNbrOccurence()+1);
                return true;
            }
            if(Dic.getMot().compareTo(noeud.getMot())>0)
            {
                this.addWord(Dic.getLeftNoeud(), noeud);
                return true;
            }
            if(Dic.getMot().compareTo(noeud.getMot())<0)
            {
                this.addWord(Dic.getRightNoeud(), noeud);
                return true;
            }
            return false;
        }
    La classe Main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static void main(String[] args) {
            // TODO code application logic here
            Index index = new Index();
            index.addWord("anssesami");
            index.addWord("amal");
            index.addWord("toto");
            if(index.getRacine()==null)
            System.out.println("c'est koi ce délire!! ");
        }
    Même si j'ai ajouté des mots, la racine de l'index est toujours null !!!!
    en effet, le problème est que lorsque j'appelle la méthode
    addWord(Racine, noeud); cette instruction Dic=noeud; ne se rapporte pas sur la racine et pourtant dans la première appelle Dic et Racine sont deux références sur la même donnée

    plzzz quelqu'un m'éxplique ce qui se passe
    Merci de votre aide

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Je ne vois pas ou Racine est positionné... Donc ca semble normal qu'il soit toujours null.

    Et si c'est l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(Dic==null)
            {
                Dic=noeud;
                return true;
            }
    qui est sensée positionner Racine, rappelons que les parametres sont passés par copie de reference et donc que racine ne sera jamais modifié comme ca. Pour illuster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void test(String str)
    {
       str = "tata";
    }
     
    private void run()
    {
       String str = "toto";
       test(str);
       System.out.println(str); // Affiche "toto" et non "tata"
    }
    Pour que ton code marche, tu as 2 solutions. Soit utiliser directement this.Racine, soit faire de Racine un objet contenant Noeud et qui peut etre modifié. Par exemple un tableau.

    Ca donnerait :
    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
    public class Index {
        public Noeud[] Racine = new Noeud[1];
     
        public Index()
        {
        }
     
        public void addWord(String mot)
        {
                mot=mot.toLowerCase();
                Noeud noeud=new Noeud(mot,1,0);
                addWord(Racine, noeud);
        }
        private boolean addWord(Noeud[] Dic,Noeud noeud)
        {
            if(Dic[0]==null)
            {
                Dic[0]=noeud;
                return true;
            }
     
    ... en remplacant Dic par Dic[0]
    Bien sur, le tableau n'est la qu'a titre d'exemple...

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2011
    Messages : 65
    Points : 88
    Points
    88
    Par défaut
    En effet, pour simplifier il ne faut pas oublier la visibilité des variables lorsqu'on code. Il te faut donc soit un champ destiné à stocker la valeur de ta racine soit simplement que ta méthode retourne la racine et que tu affectes cette valeur à chaque fois que tu veux récupérer la racine(perso je pense que la première solution est mieux niveau conception).

  4. #4
    Membre à l'essai
    Profil pro
    Développeur Java
    Inscrit en
    Septembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Septembre 2006
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    Hello,

    effectivement tu étais sur la bonne voie en remettant en cause le passage de paramètres.
    En java TOUT est passé par valeur. Quand tu envoies un objet en paramètre, c'est en fait sa référence qui est passée par valeur.

    Voici un petit lien que j'ai retrouvé:
    http://www.javaworld.com/javaworld/j...0526-pass.html

    Et celui-ci, juste le premier paragraphe:
    http://www.yoda.arachsys.com/java/passing.html

    Donc dans ton cas,
    ...
    addWord(Racine, noeud);
    }

    private boolean addWord(Noeud Dic,Noeud noeud)
    {
    if(Dic==null)
    {
    Dic=noeud;
    return true;
    }
    ...
    Une référence:
    --------------------------------
    |adresseReference | adresseObjet|
    --------------------------------

    donc quand tu passes Racine (variable de classe) en fait il fait une copie de sa référence. Tu as une référence qui pointe vers la même zone mémoire que Racine. Ensuite en faisant Dic=noeud; ta référence Dic va pointer vers la même zone mémoire que celle de noeud mais en aucun cas tu as changé vers où pointe la référence Racine. Tu changes donc juste l'adresseObjet du schéma.

    J'espère que ça t'as aidé!

    P.S: et puis pourquoi tu passes addWord(Racine, noeud); Racine ici? c'est quand même une variable de classe!!! Ceci sera mieux!
    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
    public void addWord(String mot)
        {
                mot=mot.toLowerCase();
                Noeud noeud=new Noeud(mot,1,0);
                addWord(noeud);
        }
        private boolean addWord(Noeud noeud)
        {
            if(Racine==null)
            {
                Racine=noeud;
                return true;
            }
            if(Racine.getMot().compareTo(noeud.getMot())==0)
            {
                Racine.setNbrOccurence(Racine.getNbrOccurence()+1);
                return true;
            }
            if(Racine.getMot().compareTo(noeud.getMot())>0)
            {
                this.addWord(Racine.getLeftNoeud(), noeud);
                return true;
            }
            if(Racine.getMot().compareTo(noeud.getMot())<0)
            {
                this.addWord(Racine.getRightNoeud(), noeud);
                return true;
            }
            return false;
        }

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/07/2014, 10h23
  2. Passage des paramétres à une fonction stoquée en java
    Par KnowPart dans le forum Général Java
    Réponses: 3
    Dernier message: 16/12/2010, 10h27
  3. Réponses: 2
    Dernier message: 23/05/2008, 15h06
  4. Comment faire pour le passage des paramètres
    Par dauphin34000 dans le forum Oracle
    Réponses: 14
    Dernier message: 25/04/2006, 14h18
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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