Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367

    [JAVA] Strutture ad albero

    Sto passando da C++ a Java ma non ho ancora chiaro quale sia il migliore modo per rappresentare un albero che abbia le foglie diverse dai nodi non-terminali, usando ereditarietà e puntatori (anche se sono impliciti).

    Devo usare una classe astratta o interfaccia?
    Esiste l'RTTI, cioè sapere da un puntatore alla classe base a che oggetto derivato punta veramente?
    Quali classi devo creare?

    Scusate i termini (puntatori...) ma ho ancora questa mania del C++.
    Vorrei vederci un po'chiaro, anche perchè finora ho usato le union... veramente orribile.

    Esempio:
    Un oggetto nono può puntare a diversi altri nodi oppure ad una stringa.
    NODO = altri NODI o STRINGA (terminale)
    I've got a bike. You can ride it if you like.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: [JAVA] Strutture ad albero

    Originariamente inviato da edriv
    Sto passando da C++ a Java ma non ho ancora chiaro quale sia il migliore modo per rappresentare un albero che abbia le foglie diverse dai nodi non-terminali, usando ereditarietà e puntatori (anche se sono impliciti).
    Penso che una struttura molto semplice possa essere la seguente:
    codice:
    class Nodo {
       private Nodo[] figli;
       public Nodo() { figli = null; }
       public Nodo(Nodo[] figli) { this.figli = figli; }
       public Nodo getFiglio(int indice) { return figli[indice]; }
       public void setFiglio(int indice, Nodo n) { figli[indice] = n; }
    }
    
    class NodoTerminale extends Nodo {
       private String valore;
       public NodoTerminale(String valore) { this.valore = valore; }
       public String getValore() { return valore; }
       public void setValore(String valore) { this.valore = valore; }
    }
    Originariamente inviato da edriv
    Devo usare una classe astratta o interfaccia?
    Come vedi sopra io ho usato solamente classi (non astratte... non ne vedo il motivo, a meno che la cosa non richieda qualche dettaglio in più).
    Originariamente inviato da edriv
    Esiste l'RTTI, cioè sapere da un puntatore alla classe base a che oggetto derivato punta veramente?
    Quali classi devo creare?
    Per sapere se un oggetto è di una determinata classe c'è l'operatore instanceof. Ti faccio un esempio basato sulle classi che ti ho postato sopra:
    codice:
    Nodo n = ...;  // Ho un oggetto di tipo Nodo
    
    // L'oggetto potrebbe essere un'istanza di Nodo oppure di NodoTerminale (ereditarietà)
    // Controllo:
    if (n instanceof NodoTerminale) {
       // L'oggetto 'n' è un NodoTerminale
    } else {
       // L'oggetto 'n' è un nodo interno
    }
    Originariamente inviato da edriv
    Esempio:
    Un oggetto nono può puntare a diversi altri nodi oppure ad una stringa.
    NODO = altri NODI o STRINGA (terminale)
    Penso che l'esempio che ti ho fatto sopra possa esserti d'aiuto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    Perfetto, grazie

    Io avevo creato una classe astratta che rappresentava un nodo qualsiasi, e le due classi derivate "NodoNonTerminale" e "NodoTerminale": solo che mi sono incasinato da solo...

    Altra domandina:
    se ho la dichiarazione:
    public Ciccio(int[] valori) { this.valori= vaori; }
    posso scrivere:
    Ciccio a = new Ciccio({1,2,3,4});
    ?

    Penso di no...
    I've got a bike. You can ride it if you like.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Mi pare di no. Devi comunque istanziare un array di interi e passare quello.
    Gli unici oggetti che non necessitano di una variabile sono le stringhe. Per esempio, questo pezzo di codice è perfettamente valido:
    codice:
    for (int i=0; i<"ciao".length(); i++) {
       System.out.println("stringa".charAt(i));
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    E se il numero di figli di un nodo non terminale è fisso (8) mentre un nodo terminale contiene un vettore di dim. variabili?
    Dovrei usare una classe astratta di livello superiore in questo caso?

    Nodo (astratta):
    se è NodoNonTerminale:
    private Nodo figli[8];
    se è NodoTerminale:
    Vector stringhe; // Di stringhe, in Java 2

    Così andrebbe bene?
    I've got a bike. You can ride it if you like.

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da edriv
    se ho la dichiarazione:
    public Ciccio(int[] valori) { this.valori= vaori; }
    posso scrivere:
    Ciccio a = new Ciccio({1,2,3,4});
    ?

    Penso di no...
    potresti dichiarare un metodo ke accetta un numero variabile di argomenti...
    così:

    codice:
    public double media(double valori...) {
       double somma = 0;
       int i;
       for(i = 0; i < valori.lenght; i++)
           somma += valori[i];
       return somma / (double)i;
    }
    
    e la chiami
    double x = media(5, 9,6 4, 6); //.....
    per compilare correttament devi usare la versione 1.5 dell'sdk...

    ciao!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da edriv
    E se il numero di figli di un nodo non terminale è fisso (8) mentre un nodo terminale contiene un vettore di dim. variabili?
    Dovrei usare una classe astratta di livello superiore in questo caso?

    Nodo (astratta):
    se è NodoNonTerminale:
    private Nodo figli[8];
    se è NodoTerminale:
    Vector stringhe; // Di stringhe, in Java 2

    Così andrebbe bene?
    Penso di sì. Può certamente andare bene.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    Originariamente inviato da Alex'87
    potresti dichiarare un metodo ke accetta un numero variabile di argomenti...
    così:

    codice:
    public double media(double valori...) {
       double somma = 0;
       int i;
       for(i = 0; i < valori.lenght; i++)
           somma += valori[i];
       return somma / (double)i;
    }
    
    e la chiami
    double x = media(5, 9,6 4, 6); //.....
    per compilare correttament devi usare la versione 1.5 dell'sdk...

    ciao!
    Non mi interessava come risolvere il problema, volevo solo sapere se la notazione {3,4,...} costruisse un array come "abc" costruisce una stringa.

    Per l'albero... alla fine ho risolto creando una struttura con nodi tutti uguali (che era la + corretta per quel programma, un T9) molto + semplice.
    Comunque ho imparato qualcosa.
    I've got a bike. You can ride it if you like.

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.