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

Composants Java Discussion :

Création d'un JTree à partir d'une chaine de caracère


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut Création d'un JTree à partir d'une chaine de caracère
    Bonjour,

    Déjà merci à ceux qui vont essayer de comprendre ce qui suit...

    Je dois construire un arbre(JTree) à partir de chaîne de caractère issues d'un BD.

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    chaine1_chaine6_chaine7
    chaine3_chaine6_chaine4
    chaine1_chaine3
    Le caractère "_" de séparation doit permettre d'identifier les dossier à créer.
    L'arbre pour cet exemple devrait donc être comme ceci:

    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
     
    chaine1
       |
       |__>chaine6
       |        |
       |        |__>chaine7
       |
       |__>chaine3
       |         
       |         
     
    chaine3
       |
       |__>chaine6
       |          |
       |          |__>chaine4
    Je précise qu'il peut y avoir beaucoup de "_".

    Je pense qu'il doit y avoir de la fonction récursive là-dedans mais trouve pas


    Merci d'avance.

  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
    Je ne comprends pas très bien ce que tu veux faire au final : créer des dossiers ou afficher un arbre (JTree) ?

    Tu as le choix de travailler en récursif ou non... Je dirais que Java est plutôt fait pour développer en itératif. En algorithmique, ça donne :

    En récursif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    traiterChaine(String chaine) {
       {tete, queue} = identifier(chaine);
       traiter(tete);
       traiterChaine(queue);
    }
    En itératif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    traiterChaine(String chaine) {
       String[] tableau = decouper(chaine);
       Pour chaque morceau du tableau {
          traiter(morceau);
       }
    }
    En espérant que ça t'aidera...
    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
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut
    Merci pour la réponse,

    C'est bien pour créer un JTree, je parle de dossier car mes nœud parent ont pour icône un dossier

    Pour la partie itératif, c'est bien ce que je voulais faire au départ, je faisais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    traiterChaine(String chaine) {
       String[] tableau = chaine.split("_");
       for(int i=0;i<tableau.length;i++) {
          traiter(morceau);
       }
    }
    Mais c'est à la partie "traiter(morceau)" que je bloque, car c'est là où il faut ajouter les nœud à l'arbre.
    Ajouter un nœud, je sais faire, mais je ne sais pas comment le placer au bon endroit, comme représenter sur le shéma.

  4. #4
    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
    Pour une ligne donnée, c'est assez simple : si j'ai bien compris, chaque noeud est le fils du précédent. Cela devrait donner, en itératif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    traiterChaine(String chaine) {
       String[] tableau = chaine.split("_");
       Noeud parent = racineDeTonArbre;
       for(int i=0;i<tableau.length;i++) {
          Noeud fils = new Noeud(morceau);
          parent.ajouterFils(fils);
          parent = fils; // Le fils devient parent du prochain noeud
       }
    }
    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

  5. #5
    Membre éclairé Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Par défaut
    Ce code fonctionne bien pour la première chaine de caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine1_chaine6_chaine7
    Mais quand je vais traiter la 3 ieme chaine:
    Il faut que la fonction ajoute le noeud "chaine3" au noeud existant "chaine1".
    Ces chaines de caractère,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine1_chaine6_chaine7
    chaine3_chaine6_chaine4
    chaine1_chaine3
    je les récupère à partir d'une BD, il faut donc ajouter une seconde boucle du genre:

    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
     
    tableau_chaine[] = Recup_Tab_de_la_BD();
     
    for(int i=0;i<tableau_chaine.length;i++){
     
          String[] tableau = tableau_chaine[i].split("_");
          Noeud parent = racineDeTonArbre;
     
          for(int a=0;a<tableau.length;a++) {
     
                Noeud fils = new Noeud(morceau);
                parent.ajouterFils(fils);
                parent = fils; // Le fils devient parent du prochain noeud
     
          }
     
    }
    Avec ce code, çà ne me donne pas l'arbre prévu au début de ce post.

  6. #6
    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
    Effectivement !

    Si tu dois réutiliser les noeuds existants quand tu rencontre un nom en double, je passerais personnellement par une Map, permettant de garder en mémoire les noeuds déjà existants du graph. Voilà le schéma de l'algorithme, à corriger évidemment... Voire à affiner si tu dois systématiquement passer par des noeuds existants quand ils portent le même nom.

    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
    tableau_chaine[] = Recup_Tab_de_la_BD();
     
    Map<String, Noeud> memoire = new HashMap<String, Noeud>();
     
    for(int i=0;i<tableau_chaine.length;i++){
     
          String[] tableau = tableau_chaine[i].split("_");
     
          Noeud parent;
     
          if(memoire.contains(tableau[0])) {
             parent = memoire.get(tableau[0]));
          } else {
             parent = creation du noeud tableau[0] à la racine de ton arbre;
             memoire.put(tableau[0], parent);
          }
     
          for(int a=1;a<tableau.length;a++) {
     
                Noeud fils = new Noeud(morceau);
                parent.ajouterFils(fils);
                parent = fils; // Le fils devient parent du prochain noeud
                memoire.put(morceau, fils);
     
          }
     
    }
    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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/02/2011, 14h02
  2. Entrée a partir d'une chaine de caractère
    Par Spartan03 dans le forum C
    Réponses: 5
    Dernier message: 18/03/2006, 19h48
  3. Réponses: 9
    Dernier message: 15/01/2006, 20h22
  4. Réponses: 7
    Dernier message: 15/11/2005, 10h14
  5. [Struts]Ecrire un html:link à partir d'une chaine
    Par cowa dans le forum Struts 1
    Réponses: 5
    Dernier message: 12/05/2004, 17h10

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