Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    JTree e generazione nodi da stringa

    Salve,

    ho bisogno di aiuto per la creazione di un algoritmo. La situazione è la seguente: all'interno di un DB ho due campi, uno che mi identifica un percorso di un file (senza specificare l'unità che non mi interessa) e l'altro che mi identifica il nome del file stesso. Faccio un esempio pratico "musicale" che è la prima cosa che mi viene in mente :

    codice:
    CD   PERCORSO                      FILE
    
    CD1  MUSICA\2005\Gennaio           canzone1.mp3
    CD1  MUSICA\2005\Gennaio           canzone2.mp3
    CD1  MUSICA\2005\Gennaio           canzone3.mp3
    CD1  MUSICA\2005\Febbraio          canzone1.mp3
    CD1  MUSICA\2005\Febbraio          canzone2.mp3
    CD1  MUSICA\2005\Febbraio          canzone3.mp3
    CD1  MUSICA_NUOVA\2009\Gennaio     canzone1.mp3

    Da questa situazione vorrei creare un albero strutturato nel modo seguente (non mi interessa includere il nome del file... cioè in altri termini l'ultima stringa del campo percorso sarà una foglia del mio albero)

    codice:
    CD1
     |
     |___ MUSICA
     |       |
     |       |___2005
     |             |
     |             |___GENNAIO
     |             |
     |             |___FEBBRAIO
     |             
     |___ MUSICA_NUOVA
             |
             |___2009
                   |
                   |___GENNAIO
    Ho provato a smanettare un bel pò ma ciò che ne è uscito fuori è inguardabile (sia a livello di codice che di risultato finale ) perchè tra ricorsioni e cose varie non riesco a "far capire" che, ad esempio, per intenderci, GENNAIO e FEBBRAIO appartengono allo stesso nodo MUSICA\2005, senza crearne uno nuovo. (Stessa cosa se avessi anche un percorso del tipo MUSICA\2006... non riesco a dirgli che 2006 "appartiene" al già esistente MUSICA).

    Avevo anche pensato di cambiare la struttura del DB... ma vorrei evitare di giungere a questa soluzione anche perchè dovrei cambiare un pò di cose...

    Spero di essere stato chiaro...

    Grazie a chi mi darà una mano
    Al mio segnale... scatenate l'inferno!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Molto buttato giù, puoi fare una cosa del genere:

    codice:
    import javax.swing.*;
    import javax.swing.tree.*;
    
    public class TestFrame extends JFrame {
        public TestFrame() {
            super("Test");
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(300, 300);
    
            DefaultMutableTreeNode root = new DefaultMutableTreeNode("CD1");
    
            String[] paths = { "MUSICA\\2005\\Gennaio", "MUSICA\\2005\\Febbraio", "MUSICA_NUOVA\\2009\\Gennaio" };
    
            for (int i = 0; i < paths.length; i++) {
                String[] parts = paths[i].split("\\\\");
    
                DefaultMutableTreeNode node = root;
    
                for (int j = 0; j < parts.length; j++) {
                    node = findOrAddNode(node, parts[j]);
                }
            }
    
            DefaultTreeModel treeModel = new DefaultTreeModel(root);
            JTree tree = new JTree(treeModel);
    
            getContentPane().add(new JScrollPane(tree));
        }
    
        private static DefaultMutableTreeNode findOrAddNode(DefaultMutableTreeNode node, Object userObject) {
            for (int i = 0; i < node.getChildCount(); i++) {
                DefaultMutableTreeNode n = (DefaultMutableTreeNode) node.getChildAt(i);
    
                if (n.getUserObject().equals(userObject)) {
                    return n;
                }
            }
    
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(userObject);
    
            node.add(newNode);
    
            return newNode;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TestFrame().setVisible(true);
                }
            });
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie mille, funziona perfettamente... Quello che mi mancava era il "find" degli oggetti già inseriti, perchè anche io avevo impostato il tutto partendo da un array di percorsi differenti e poi splittando le singole cartelle. Ma poi mi bloccavo su quello che tu hai chiamato findOrAddNode.

    Ancora grazie
    Al mio segnale... scatenate l'inferno!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.