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 :

Remplir un objet dans un tableau d objet


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut Remplir un objet dans un tableau d objet
    Bonjour a tous,

    j'ai un petit souci qui me torture l esprit depuis quelques temps.
    En fait je voudrais remplir un objet dans un tableau d objet

    voila déja mon fichier principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Node
    {
    	String id_node;
    	String question;
    	String result;
    	Node leftnode;
    	Node rightnode;
    }
    pour remplir mon tableau d objet avec les variables j'ai fait comme ceci en utilisant des arraylist qui elle même était rempli par une BDD


    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
     
    public String id_temp;
    public String question_temp;
    public String result_temp;
     
     
    List<String> ids = new ArrayList<String>();
    List<String> questions = new ArrayList<String>(); 
    List<String> results = new ArrayList<String>(); 
     
     
    		      while (rs.next())
    		      {
    		    	  id_temp = rs.getString(1);
    		    	  question_temp = rs.getString("question");
    		    	  result_temp = rs.getString("result");
     
     
    		    	  ids.add(id_temp);
    		    	  questions.add(question_temp);
    		    	  results.add(result_temp);
     
    		      }
     
    for (int cpt = 1; cpt < taille; cpt++)
    		      {
    		    	  nodes[cpt-1] = new Node();
    		    	  nodes[cpt-1].id_node = ids.get(cpt-1);
    		    	  nodes[cpt-1].question = questions.get(cpt-1);
    		    	  nodes[cpt-1].result = results.get(cpt-1);
    		      }
    Jusque la, pas de problème, mon tableau d objet se remplit correctement mais c est quand je veut remplir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodes[].leftnode / rightnode
    que cela coince

    Grosso modo, je souhaite qu'a la fin, je puisse faire quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodes[cpt-1].leftnode.question
    Merci a vous

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    ta question n'a rien à voir avec les tableaux, et leur remplissage.

    Tes deux variables :

    sont des Node, comme nodes[cpt-1] : donc tu leur affectes une valeur de la même manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodes[cpt-1].leftnode= new Node();
    Maintenant reste à savoir comment créer ce node... là, c'est toi qui sait...
    Je suppose que tu as une requête à faire, similaire à celle qui de permet de construire tes nodes[]...

    Fait une méthode à part peut être pour aller cherche le leftNode et le rightNode : je suppose que ton node courant doit avoir des informations à passer en paramètre de cette méthode pour construire la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodes[cpt-1].leftnode= creerNode(param1, param2, ...);
    Peut être que ta requête principale récupère également les sous-nodes en question , auquel cas, il ne faut pas utiliser un tableau, mais plustôt une Map (clef id de node, valeur associée le node),
    par exemple : quand tu trouves un node qui à un parent (tu devrais avoir l'id de ce parent), tu cherches ce parent dans la map (et tu le met dans left ou right), sinon tu l'ajoutes à ta map (puisqu'il n'a pas de parent).

    Le résultat final est la liste de nodes directement présent de le "values" de la map.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    Merci pour ta réponse ^^

    En fait je souhaite que par exemple prenne la valeur de "id_node". Je sais pas si tu a deviné mais je suis en train de faire un arbre binaire avec des objets nœuds.

    Le but du jeu c'est si l'utilisateur répond "oui" a la question, alors ont va aller a gauche en utilisant "leftnode" avec un nouveau objet Node qui a une nouvelle question et si il répond non, ont va a droite avec "rightnode".

    Donc il faudrait insérer un "id_node" dans left/right node ... et c est la que cela coince.

    Merci et désolé pour le mauvais titre

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par biohazard401 Voir le message
    Merci pour ta réponse ^^

    En fait je souhaite que par exemple prenne la valeur de "id_node". Je sais pas si tu a deviné mais je suis en train de faire un arbre binaire avec des objets nœuds.
    oui, c'est évident que tu cherches à faire un arbre binaire

    mmm id_node, c'est un String, pas un Node...

    Ce que j'ai compris :
    - tu fais une requête qui va chercher des nodes
    - tu mets ces nodes dans un tableau
    - ensuite tu veux créer les nodes droites et gauches de chacun de ces nodes

    et pour ça, je peux pas deviner d'ou viennent ces noeuds (droite et gauche) ? S'ils sont dans ta base, il y a forcément un moyen de faire une requête pour les retrouver

    Imaginons un système de gestion d'arbre binaire hypothétique - il pourrait être modélisé ainsi :

    La table Node
    - id (de type identity)
    - question (de type varchar)
    - id_node_left ( de type clef vers Node)
    - id_node_right ( de type clef vers Node)

    Ou encore :
    La table Node :
    - id ( de type identity)
    - question (de type varchar )
    - parent (de type clef vers Node)
    - position (un char, L ou R, pour left ou right)

    Comment est modélisé le tien ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    Ma BDD est faite comme cela:

    id_node -> integer, PK et auto-incrémenter
    question -> varchar
    result -> varchar
    id_left_node -> integer
    id_right_node -> integer

    en fait id_left/right me servent à aller chercher un nouvel id qui correspond a une question.

    par exemple, mes premières lignes de ma BDD donne cela:
    id: 1 - question : etes vous un homme ? - result : null - id left: 2 - id right:3
    id: 2 - question : etes vous un artiste ? - result: null - id left : 4 - id right:5

    dans l exemple, pour la première ligne, si l utilisateur répond "oui", ont va aller chercher la question qui a l'id n°2 et si il répond "non", ont va la prendre la question avec l'id n°3

    Ce que je recherche a faire c est de trouver une égalité entre id_left/right et id_node. Si dans les 2 arraylist, ont trouve le même id, alors id_left/right va prendre comme valeur id.

    Je veut faire comme cela parce que au fil du temps, la bdd va s'agrandir et je ne pourrais plus gérer manuellement ces données. Avec cette méthode, l'algo va faire ce que je souhaite automatiquement.

    J'espère que j'ai étais assez claire

    merci

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ok, j'ai un modèle maintenant

    Donc, le problème à régler c'est que quand tu lis un node, le node gauche et le node droit ne sont pas forcément déjà lu.

    Du coup, c'est pas évident de pouvoir construire les nodes droites et gauches, tant qu'on les a pas lus.

    La solution la plus simple est de charger toutes les infos dans une map, en utilisant une classe intermédiaire (un sorte de faux node), et de construire les nodes à la fin. Bon tu fais un truc dans le genre en utilisant 3 listes, c'est pas le plus simple à manipuler, mais soit, ça peut marcher. Il te faut toutefois 2 listes de plus, une pour les ids de noeuds left, une pour les ids de noeuds right

    Ou alors tu crées un ResultSet qui peut fonctionner dans les deux sens (forward et backward), et tu te déplaces dans le résultset pour chercher les noeuds left et right, puis tu reviens à la position du node courant, pour continuer le chargement : il te faudra quand même stocker tes id dans un set pour "sauter" les noeuds déjà lus en tant que left ou right d'un autre

    Donc en se basant sur le code que tu as fait, tu as trois listes, ajoutes en 2 pour les nodes left et right :

    tu peux créer une méthode :

    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
    public static Node creerNode(String id, List<String> ids, List<String> questions, List<String> results, List<String> left, List<String> right) {
     
       // on cherche les infos correspondant à l'id :
       int index =  ids.indexOf(id);
       if ( index<0 ) {
         // erreur à gérer : pas de node avec cet id
         return null;
       }
     
       Node node = new Node();
       node.id_node = id;
       node.question = questions.get(id);
       node.result = results.get(id);
       String leftId = left.get(id);
       if ( leftId!=null ) node.leftNode = creerNode(leftId, ids, questions, results, left, right);
       String rightId = right.get(id);
       if ( rightId!=null ) node.rightNode = creerNode(rightId , ids, questions, results, left, right);
    }
     
     
    }
    Avec une map, en partant du principe que les fils sont toujours placés après les parents (sinon, ça va être galère : il faudrait déterminer d'abord tous les nodes root (ceux sans parent)) :

    d'abord une classe pour charger les infos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class InfoNode {
        public String question;
        public String result;
        public String leftId;
        public String rightId;
    }
    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 String id_temp;
    public String question_temp;
    public String result_temp;
     
    Map<String, InfoNode>  infos=new LinkedHashMap<String, InfoNode>();
     
     
    		      while (rs.next())
    		      {
                              InfoNode info = new InfoNode();
                              info.question = rs.getString("question");
                              info.result = rs.getString("result");
                              info.leftId = rs.getString("id_left_node");
                              info.rightId = rs.getString("id_right_node");
     
                              infos.put(rs.getString(1), info);
     
    		      }
     
    // fonctionne si les nodes fils sont après leur parent dans le resultset (sinon, on détermine d'abord les root, on les mets dans une liste, puis on parcout cette liste)
    List<Node> nodeList=new ArrayList<Node>();
    while( !infos.isEmpty() ) {
         String id = infos.keySet().iterator().next();
         nodeList.add( creerNode(id, infos));
    }
     
    nodes = nodeList.toArray(new Node[nodeList.size()]);
     
    }
    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 static Node createNode(String id, Map<String, InfoNode> infos) {
            InfoNode info = info.remove(id); // on supprime le node, comme ça il ne sera pas retraité
            if ( info==null ) {
                // erreur à gérer
                return null;
            }
    	Node node = new Node();
    	node.id_node = id;
            node.question = info.question;
            node.result = info.result;
            if ( info.leftId!=null ) {
                node.leftNode = createNode(info.leftId, infos);
            }
            if ( info.rightId!=null ) {
                node.rightNode = createNode(info.rightId, infos);
            }
            return node;
    }

    PS: j'ai tapé directement dans le forum, il l'y a peut être des fautes de frappes... et des trucs qui manquent je te laisse remplire les trous
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par biohazard401 Voir le message
    Ce que je recherche a faire c est de trouver une égalité entre id_left/right et id_node. Si dans les 2 arraylist, ont trouve le même id, alors id_left/right va prendre comme valeur id.
    ça par contre j'ai rien compris
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Accès methode d'un objet dans un tableau d'objet
    Par unapologetic dans le forum Langage
    Réponses: 4
    Dernier message: 20/08/2013, 09h47
  2. [WD17] Ajouter un objet dans un tableau d'objets
    Par draco951 dans le forum WinDev
    Réponses: 6
    Dernier message: 20/03/2012, 07h54
  3. Rechercher un objet dans un tableau d'objet
    Par mikaelm dans le forum Ruby
    Réponses: 6
    Dernier message: 11/06/2007, 17h58
  4. Insérer un tableau d'objet dans un Jpanel
    Par Flophx dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 25/04/2006, 20h37
  5. Free dans un tableau d'objets
    Par maredami dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2006, 16h03

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