Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [JAVA] metodo toString su albero binario ( particolare )

    Ciao a tutti!!!!

    ho fatto un esame in cui ho una classe astratta con un metodo concreto toString(). Ho provato in tutti i modi a realizzarlo ma non sono venuto a niente. toString appunto ritorna una stringa e questo va fatto ricorsivo e non capisco come poterlo fare. Vi do la specifica della classe:

    codice:
    public abstract class BEalbero 
    {
    	// OVERVIEW: Un BEalbero e' un albero binario, in cui nodi e foglie sono etichettati con valori omogenei.
    	// Un BEalbero e' modificabile.
    	// Tipici valori astratti:
    	// n, se e' una foglia etichettata n
    	// ( n, a1, a2 ) , se e' un nodo etichettato n con sottoalberi a1 e a2
    	
    	public abstract BEalbero sinistro() throws NotANode;
    	// EFFECTS: se this e' una foglia solleva NotANode, altrimenti
    	// ritorna il sottoalbero sinistro di this
    	
    	public abstract BEalbero destro() throws NotANode;
    	// EFFECTS: se this e' una foglia solleva NotANode, altrimenti
    	// ritorna il sottoalbero sinistro di this
    	
    	public abstract Object etichetta();
    	// EFFECTS: ritorna l'etichetta di this
    	
    	public abstract boolean foglia();
    	//EFFECTS: se this e' una foglia ritorna true, altrimenti ritorna false
    	
    	public abstract BEalbero nuovoalbero( Object x, BEalbero d ) throws ClassCastException, NullPointerException;
    	// EFFECTS: se x o d sono null solleva NullPointerException;
    	// se x oppure le etichette di d non hanno lo stesso tipo delle etichette di this, solleva ClassCastException;
    	// alstrimenti restituisce un nuovo BEalbero, la cui radice e' etichettata da x,
    	// e i cui sottoalberi sinistro e destro sono this e d.
    	
    	public abstract void rimpiazzasinistro( BEalbero s ) throws ClassCastException, NullPointerException;
    	//EFFECTS: se s e' null solleva NullPointerException;
    	// se il tipo delle etichette di s e' diverso da quello delle etichette di this solleva ClassCastException, altrimenti
    	// rimpiazza il sottoalbero sinistro di this con s.
    	
    	public String toString()
    	{
            }
    }
    praticamente da questa bisogna creare due sottoclassi che la implementano, Nodo e Foglia in cui nodo ha l'etichetta e due sottoalberi e foglia ha solamente l'etichetta.

    Metto in dubbuio la bonta' di questa scelta per realizzare l'albero ma cosi' e', forse e' per questo che nn riesco a fare toString. Potreste darmi qualche suggerimento?

    Grazie!!!
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] metodo toString su albero binario ( particolare )

    Originariamente inviato da Poker1
    ho fatto un esame in cui ho una classe astratta con un metodo concreto toString(). Ho provato in tutti i modi a realizzarlo ma non sono venuto a niente. toString appunto ritorna una stringa e questo va fatto ricorsivo e non capisco come poterlo fare.
    Innanzitutto vorrei fare un appunto: secondo la mia (modestissima!) opinione non è una buona cosa lanciare una eccezione se non c'è un sotto-ramo. Sarebbe preferibile ritornare semplicemente 'null' se il sotto-ramo non c'è.

    A parte questo posso farti un esempio di come si possa gestire il toString. Ti posto il codice per un semplice albero binario in cui ogni nodo ha una informazione di tipo String.

    codice:
    public class Prova {
        public static void main (String[] args) {
            BiTree a, b, c, d;
    
            d = new BiTree ("ciao");
            b = new BiTree ("prova", d, null);
            c = new BiTree ("binario");
            a = new BiTree ("albero", b, c);
    
            System.out.println (a);
        }
    }
    
    class BiTree {
        private String text;
        private BiTree left;
        private BiTree right;
    
        public BiTree (String text) {
            this.text = text;
        }
    
        public BiTree (String text, BiTree left, BiTree right) {
            this.text = text;
            this.left = left;
            this.right = right;
        }
    
        public String getText () {
            return text;
        }
    
        public BiTree getLeft () {
            return left;
        }
    
        public BiTree getRight () {
            return right;
        }
    
        public String toString () {
            String s = "";
    
            if (getLeft () != null)
                s += getLeft ();
    
            s += "[" + getText () + "] ";
    
            if (getRight () != null)
                s += getRight ();
    
            return s;
        }
    }
    L'albero che ho costruito nel main è fatto così:

    codice:
          albero
            /\
           /  \
          /    \
       prova  binario
        /\      /\
       /
      /
    ciao
     /\
    E se lanci il programma stampa:

    [ciao] [prova] [albero] [binario]
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    il problema non e' fare la toString con un albero binario gestito in maniera umana, il problema e' che questo vuole una sottoclasse Foglia che implementa la classe astratta e la sottoclasse Nodo . Cioe' secondo te e' una cosa "normale" incasinarsi la vita in questo modo?

    Io mi sarei fatto una classe Nodo che contiene informazioni sull'etichetta e due puntatori a sottoalbero sinistro e sottoalbero destro, non una classe che implementa la foglia e una che implementa un nodo
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Poker1
    il problema non e' fare la toString con un albero binario gestito in maniera umana, il problema e' che questo vuole una sottoclasse Foglia che implementa la classe astratta e la sottoclasse Nodo . Cioe' secondo te e' una cosa "normale" incasinarsi la vita in questo modo?
    Boh ... su queste questioni di "design" in genere preferisco "passare la mano" ....
    Cioè vuole che Foglia derivi da BEalbero e che pure Nodo derivi da BEalbero??? Sarebbe anche fattibile.
    In Nodo avrai 2 campi di tipo BEalbero. Quindi a questi campi puoi assegnare una Foglia o un Nodo.
    Sinceramente non vedo un gran vantaggio!

    Originariamente inviato da Poker1
    Io mi sarei fatto una classe Nodo che contiene informazioni sull'etichetta e due puntatori a sottoalbero sinistro e sottoalbero destro, non una classe che implementa la foglia e una che implementa un nodo
    Appunto .... come ho fatto nel mio esempio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    mha ora provo...non ci sto piu capendo niente.

    Devo fare anche la "funzione di astrazone" e "invariante di rappresentazione" che solo noi in tutto il mondo studiamo.... vediamo cosa esce fuori
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

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