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

    [java] conversione albero in JTree

    Ciao a tutti,
    devo convertire una struttura ad albero (TreeSLL) in un JTree.
    Ho scritto il seguente codice:
    codice:
    private void createNodes(DefaultMutableTreeNode top,TreeSLL t) {
            DefaultMutableTreeNode category = null;
            QueueList todo = new QueueList();
            Trees.TreeNode tr = null;
            tree = new JTree(top);
            t.reset();
            Trees.TreeNode n = t.cursor;
            todo.enqueue(n);/*inserisco nella coda la radice*/
            DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
            while ( !todo.isEmpty() ){/* finchè la coda non è vuota*/
                    tr = (Trees.TreeNode)todo.dequeue();/*estraggo il primo nodo*/
                    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(tr.getValue());
                    iter = (SL_ListIterator) tr.childList.iterator();
                    if (!tr.equals(n)){
                                    
                        TreePath path = tree.getNextMatch(tr.parent().getValue(), 0, Position.Bias.Forward);
                        if (path == null)
                            System.out.print("null");
                        
                        else{
                            
                            DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
                            model.insertNodeInto(newNode, node, node.getChildCount());
                            }
                        }
                    
                    while (iter.hasNext())
                        todo.enqueue(iter.next());
                }
    Dove "todo" è una struttura a coda che mi permette la visita per livelli del mio albero "t" che passo come parametro.
    La funzione deve visitare tutto l'albero "t" e produrre il JTree "tree".
    L'idea è di visitare tutti i nodi di "t" e inserirli man mano sotto al loro padre (trovato dal metodo tree.getNextMatch(tr.parent().getValue(), 0, Position.Bias.Forward);
    , dove tr,parent.getValue è il valore stringa del padre che dovrebbe essere già nel JTree nel momento in cui vado a cercarlo).

    Il problema è che inserisce solo i nodi con padre uguale alla radice dell'albero, pocihè il suddetto metodo sembra non trovare i padri diversi dalla radice.

    Spero di essermi spiegato e che qualcuno possa aiutarmi.
    Grazie.

  2. #2
    Capisco che io codice può risultare incomprensibile...ma mi interessava sapere se potevo fidarmi del metodo:
    TreePath path = tree.getNextMatch(tr.parent().getValue(), 0, Position.Bias.Forward);

    grazie.

  3. #3
    1)Devi riprodurre la struttura del tuo albero in modo identico sul Jtree?
    2)Devi visitarlo per forza per livelli l'albero?
    3)Posta un po di documentazione sui metodi per navigare questi TreeSSL che non li conosco.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    Originariamente inviato da unomichisiada
    1)Devi riprodurre la struttura del tuo albero in modo identico sul Jtree?
    2)Devi visitarlo per forza per livelli l'albero?
    3)Posta un po di documentazione sui metodi per navigare questi TreeSSL che non li conosco.
    1) si
    2) no, ma mi sembrava il modo più semplice x convertirlo.
    3) non esiste documentazione...è una classe creata...posto un pò di metodi x capirne il funzionamento.

    Questa è la classe che descrive il nodo, nel post precedente è identificata da Trees.TreeNode per differenziarli da i javax.swing....TreeNode:
    codice:
    public class TreeNode {
        
        String key;
        public SL_List childList;
        TreeNode parent;
        
        
        /** Creates a new instance of TreeNode */
        public TreeNode(TreeNode parent, String ob) {
            key = ob;
            this.parent = parent;
            childList = new SL_List(); 
            
        }
        public String getValue(){
            return this.key;}
         
        public void setValue(String ob){
            this.key=ob;}
        
            void addChild(String ob){
            childList.addLast(new TreeNode(this, ob));
        }
        
        TreeNode getChild(int childIndex){
            return (TreeNode) childList.getAtIndex(childIndex);
        }
        
        boolean removeChild (TreeNode tr){
            if (childList.remove(tr)){
                tr.parent = null;
                tr.childList = null;
                return true;
            }
            else
                return false;
        }
        
        static int size(TreeNode tr){
            if (tr == null)
                return 0;
            else {
                int i = 1;
                Iterator iter = tr.childList.iterator();
                while (iter.hasNext())
                    i = i + size((TreeNode)iter.next());
                return i;
            }
        }
    ...poi qlc sul TreeSLL...

    codice:
    public class TreeSLL {
    public TreeNode root;      // radice dell'albero private int count;
    private int count;          // numero di nodi dell'albero 
    public TreeNode cursor;    // riferimento al nodo corrente 
    
    // post: costruisce un albero vuoto 
    public TreeSLL() { 
        clear() ;
    }
    
    // post: svuota l'albero 
    public void clear() {
    root = cursor = null;
    count = 0 ;
    }
    
    // post: ritorna il numero di nodi dell'albero public int size () { return count;}
    
    // post: ritorna true se l'albero e' vuoto; false altrimenti 
    public boolean isEmpty() { return (count == 0);}
    
    // pre:  ob non nullo
    // post: l'oggetto e' inserito come figlio del nodo corrente, 
    //       o come radice se l'albero e' vuoto. Ritorna true. 
    public boolean insert (String ob) {
    if (isEmpty())
        cursor = root = new TreeNode(null, ob) ;
    else
        cursor.addChild(ob) ;
        count++;
    return true;
    }
    
    // pre: ob non nullo
    // post: ritorna il riferimento al primo nodo con valore ob rispetto
    //       alla visita in profondita' 
    private TreeNode findPos(String ob, TreeNode n) { 
    TreeNode k;
    if (n == null || n.key.equals(ob)) return n;
    Iterator iter = n.childList.iterator();
    while (iter.hasNext()) {
        k = findPos(ob, (TreeNode)iter.next());
        if (k != null && k.key.equals (ob) ) 
            return k;
    }
    return null;
    }
    
    // post: cursor si sposta sulla radice 
    public void reset() { cursor = root;}
    // post: se possibile cursor si sposta sul figlio in posizione 
    //       childindex e ritorna true; altrimenti rimane dov'è' e 
    //       ritorna false 
    public boolean moveDown (int childIndex) {
    if (isEmpty() || childIndex <= 0  || childIndex > childCount())
    	return false;  // posizione non valida 
    else { // posizione valida
    	cursor = cursor.getChild(childIndex-1);
            return true;
        }
    }
    
    // pre: parametri diversi da nuli
    // post: appende a sb una stringa che rappresenta il sottoalbero con
    //       radice n secondo una visita Breadth First 
    private void BFformat(TreeNode n, StringBuffer sb) {
    QueueList todo = new QueueList();
    TreeNode tr = null;
    todo.enqueue(n) ;
    Iterator iter = n.childList.iterator();
    while ( !todo.isEmpty()){
        tr = (TreeNode)todo.dequeue();
        sb.append(tr.key.toString() + ",");
        iter = tr.childList.iterator();
        while (iter.hasNext())
            todo.enqueue(iter.next());
        }
    }
    // post: ritorna una stringa che rappresenta l'albero 
    public String toString() {
    StringBuffer sb = new StringBuffer();
    sb.append("Tree: <") ;
    if (root != null)
        BFformat(root,sb) ;
    sb.append ( ">") ;
    return sb.toString();
    }
    ...spero vi possa aiutare!
    Grazie

  5. #5
    No è molto più semplice usare una visita inorder,postorder o preorder.

    codice:
    //visita risocsivamente l'albero di nodi del documento xml e costruisce
        //l'albero di TreeNodes corrispondente
        public static void loadData(Element rootElement,DefaultMutableTreeNode root)
        {
            List children = rootElement.getChildren();
            Iterator childrenIter = children.iterator();
            while(childrenIter.hasNext())
            {
                Element current = (Element)childrenIter.next();
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(current.getName());
                root.add(newNode);
                loadData(current,newNode);
            }
        }
    Il codice sopra fa la cosa che vuoi fare tu con un documento xml (che ha una struttura ad albero), quindi devi solo modificare quello.

    A grandi linee l'algoritmo da seguire è:
    -chiamare il metodo con parametri un nodo di tipo TreeSSl che è la radice del tuo albero ed un DefaultMutableTreeNode che è la radice del Jtree da costruire.
    -A partire dal padre fare un ciclo e salvare in un array o un Vector o una List o quello che è tutti i figli del nodo corrente.
    -Far partire un ciclo che scandisce ad uno ad uno i nodi di questo array (i figli del nodo corrente) e per ognuno (cioè ad ogni iterazione del ciclo) fare le seguenti cose
    1)Ottenere l'informazione dal nodo di tipo TreeSSl ed inserirla in un nuovo DefaultMutableTreeNode creato sul momento
    2)Aggiungere il nuovo DefaultMutableTreeNode come figlio del DefaultMutableTreeNode corrente (il parametro del metodo)
    3)Richiamare ricorsivamente il metodo con parametri il nodo TreeSSl esaminato nella corrente iterazione del ciclo e il nuovo DefaultMutableTreeNode creato.

    Il resto lo fa la ricorsione.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Così mi looppa...
    codice:
    private void createNodes(Trees.TreeNode el,DefaultMutableTreeNode top) {
            SL_ListIterator iter = (SL_ListIterator) el.childList.iterator();
            while (iter.hasNext()){
                Trees.TreeNode current = (Trees.TreeNode) iter.next();
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(current.getValue());
                top.add(newNode);
                createNodes(current,newNode);
            }
    ..ora vedo che fare...

  7. #7
    Grazie mille!
    Ho risolto...ora funziona alla grande!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.