0 votes

Présentation des données sous forme d'arborescence

Je dispose des informations suivantes en provenance d'un serveur et je dois présenter les informations sous forme arborescente à l'utilisateur. Les données du serveur sont présentées sous cette forme :

APP          net        main 
Account      net        main
Address      net        main
APP          net        main 
Person       book       optel
Person       book       ggggg
Person       book       show 
Bindings     apple      parse
Bindings     apple      findProject
Bindings     apple      show 

Les positions des colonnes ne sont pas fixes. La première colonne peut devenir la deuxième ou la troisième en fonction des préférences de l'utilisateur.

Dans chaque ligne, la première donnée doit être le parent de la deuxième donnée, la deuxième donnée doit être le parent de la troisième donnée et s'il semble y avoir une quatrième donnée, alors ce sera l'enfant de la troisième et cela se poursuit ainsi.

Je dois être capable de construire cette structure arborescente tout en bouclant sur les informations provenant du serveur.

Cela démarre du côté gauche (colonne), ce qui signifie que la colonne de gauche sera le premier parent. Je dois présenter les informations du serveur sous forme d'arbre comme ceci :

APP
  net
     main

Account
    net
       main

...

Bindings
   apple
       show

etc...

Exigence facultative : Et s'il est possible, je dois également être capable d'utiliser la structure pour créer un tableau. Un ami m'a suggéré d'utiliser une liste chaînée mais je ne sais pas s'il a raison et s'il a raison, comment l'utiliser.

1voto

Tempus Points 22972

Vous pourriez utiliser un JTree pour afficher une structure en arborescence à l'utilisateur. Un exemple est présenté ici. Voici à quoi cela pourrait ressembler en image, voyez si c'est ce que vous voulez :

JTree

Si vous voulez utiliser les chaînes mentionnées ci-dessus, vous pouvez utiliser le StringTokenizer ainsi que votre modèle d'arbre pour construire la structure. Assez simple.

1voto

Mark Renouf Points 13128

Étape 1, analyser les données dans une structure de tableau.

Vous aurez besoin d'un objet simple pour représenter un nœud d'arbre. Voici un point de départ :

// Implémenter une classe de nœud d'arbre classique
classe abstraite Node {
    String label;
    Map childNodes;

    abstrait Node getChild(String label);
    abstrait void addChild(Node child);
}

Et voici comment je m'approcherais de l'analyse de l'entrée dans un arbre en utilisant cette structure :

Node root = new Node("root");

Lecteur lecteur = new InputStreamReader(new BufferedInputStream(...));

String ligne;

tant que ((ligne = lecteur.readLine) != null) {
    String[] colonnes = ligne.split("\\s*");
    // Lire les données sous forme tabulaire

    // Construire une structure d'arbre d'objets Node

    // REMARQUE : Cela pourrait être optimisé pour tirer parti de l'entrée triée.

    Node curr = null;
    Node prev = root;
    pour (int i = 0; i < colonnes.length; i++) {
        curr = prev.getChild(colonnes[i]);

        // Si ce nœud n'a pas encore été vu, le créer
        si (curr == null) {
             curr = new Node(colonnes[i]);
             prev.addChild(curr);
        }
        prev = curr;
    }
}

Après cela, vous aurez toutes les données attachées au nœud racine. Pour afficher un tableau, vous pouvez inverser ce processus, effectuer une traversée en profondeur et imprimer le chemin complet de chaque nœud en tant que colonne de la sortie.

Pour un arbre, vous avez déjà la structure. Si vous adaptez une classe de modèle existante en tant qu'objet Node (par exemple, Swing), alors vous pourriez simplement transmettre les données de l'arbre à un JTreeNode et vous avez terminé. Sinon, il est trivial de transformer l'arbre de différentes manières (par exemple, le rendre en HTML statique ou en JSON pour le rendre dans un navigateur web).

0voto

wai Points 1777

Si ce n'est que pour la présentation, vous n'avez pas besoin de les stocker en mémoire persistante, donc vous n'avez pas besoin de structures de données. (Sauf s'il est explicitement indiqué que vous devez les utiliser)

Juste une idée, et comment j'aurais abordé ce problème en ne tenant compte que des contraintes que vous avez spécifiées. Je suppose que vous savez déjà comment les lire par lignes. Pour la première ligne, réfléchissez à la manière dont vous allez diviser des mots individuels en un 'nœud' propre à lui-même. (Indice : Java a une fonction String.split()). Il existe d'autres façons de le faire aussi.

Ensuite, stockez-les quelque part, dans un tableau ou autre, tant que vous pouvez les récupérer dans l'ordre. Les listes chaînées feront l'affaire aussi, tout comme les files d'attente.

En les imprimant dans une boucle, ajoutez un saut de ligne et de l'espace entre eux pour créer le look de la sortie. Ensuite, vous pouvez même recycler le tableau que vous avez déclaré précédemment pour la prochaine ligne. Bonne chance!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X