Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92

    Lista ordinata in Java

    Ho un problema che mi è stato posto da risolvere in java. Di fatto il testo del problema recita così:

    "Una lista concatenata è una struttura dati che può essere usata al posto di un array e che rispetto a questo ha il vantaggio di poter contenere un numero qualsiasi di oggetti senza essere dimensionata in fase di creazione. Essa è composta di elementi ciascuno dei quali contiene una referenza all’oggetto che interessa memorizzare e una referenza all’elemento successivo. Scrivere una classe che implementi una gestione di una generica lista concatenata."

    io ho scritto una classe Oggetti che di fatto usa gli interi, dove l'oggetto di Oggetti è composto da un intero e una referenza all'elemento successivo che sarà assegnato nel main del programma principale, ecco le classi.

    Classe che serve per importare interi tramite tastiera:

    import java.io.*;

    public class KeyBoard{
    private InputStreamReader isr = new InputStreamReader(System.in);
    private BufferedReader in = new BufferedReader(isr);

    public int read ()
    {
    String val = null;

    try {
    val = in.readLine();
    } catch (IOException e) {}

    int number = Integer.valueOf(val).intValue();

    return number;
    }

    }

    classe Oggetti:


    class Oggetto {

    private Integer o;
    private Oggetto ref;

    public Oggetto (int intero)
    {
    o = new Integer(intero);
    }

    public Oggetto referenza()
    {
    return ref;
    }

    public void visualizza()
    {
    System.out.println(o);
    }
    }

    Qunado compilo mi dà tutto ok, notare il metodo referenza che ritorna la referenza dell'oggetto ref che nel programma principale sarà usato istanza a un nuovo oggetto di tipo oggetto creando la lista ordinata.

    ecco il metodo principale:

    class usaOggetto{
    public static void main(String argv[])
    {
    KeyBoard numero = new KeyBoard();
    Oggetto oggetto = new Oggetto(numero.read());

    oggetto.referenzia() = new Oggetto(numero.read());
    oggetto.visualizza();


    }
    }

    quando compilo mi dice che la linea:
    oggetto.referenzia() = new Oggetto(numero.read());
    crea un errore: unexpeted type.

    Qualcuno sa dove sbaglio?

  2. #2
    Non ho guardato il codice, ma la gestione di una lista semplice concatenata (stile C) è possibile implementarla tramite l'uso di Vector, una struttura dati che contiene al suo interno oggetti.
    L'aggiunta dinamica viene effettuta tramite il metodo add, utilizzabile per maggiore compatibilità tramite l'aggiunta di oggetti Integer.
    Una gestione con ciclo while basta ad implementare la logica delle liste.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    Ti ringrazio per aver risposto, ma il fatto che in origine avevo implementato la classe Oggetto non con delle variabili di istanza di tipo int ma degli oggetti di tipo Object e inoltre è richiesta una soluzione senza l'uso della classe Vector.

    Il mio cruccio è se ref può essere usata come referenza di un altro Oggetto di tipo Oggetto (scusate il gioco di parole) e può essere richiamata con il metodo per essere istanziata a sua volta.
    tramite questa linea di codice:

    oggetto.referenza() = new Oggetto(numero.read());

    questo è più o meno il nocciolo della questione, un metodo può tornare una referenza? Che poi sarà istanziata nel programma principale?

  4. #4
    Dovrebbe esistere un metodo referenza() che torna un indirizzo vuoi dire?
    Ma il nome della variabile non è esso stesso una referenza(indirizzo)?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    L'errore nasce dal fatto che non ha senso assegnare un valore a un metodo come provi a fare in:
    codice:
    oggetto.referenzia() = new Oggetto(numero.read());
    (a parte il fatto che il nome del metodo è "referenza" e non "referenzia").

    Così com'è, la classe Oggetto non offre alcun modo per modificare la sua variabile ref.

    Per poter assegnare un valore a ref, hai bisogno di accedere a ref da una classe esterna.
    Hai due possibilità:

    1)
    rendere ref pubblica:
    codice:
    //private Oggetto ref;
    public Oggetto ref;
    e accedervi direttamente:
    codice:
    //oggetto.referenzia() = new Oggetto(numero.read());
    oggetto.ref = new Oggetto(numero.read());
    2)
    lasciare ref privata e introdurre in Oggetto un metodo pubblico per modificarla (c.d. setter):
    codice:
    public void setRef(Oggetto ref) {
         this.ref=ref;
    }
    e utilizzare questo metodo per modificare ref:
    codice:
    //oggetto.referenzia() = new Oggetto(numero.read());
    oggetto.setRef(new Oggetto(numero.read()));

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    92
    Scusate l'insistenza, secondo voi poi come si fa a recuperare un elemento qualsiasi dalla lista dinamica?

    allora si deve accedere dal primo elemento, ma poi se per esempio ne introduco cinque e voglio recuperare il terzo?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    Nella tua lista dinamica, l'unico riferimento ad un elemento è contenuto nell'elemento precedente. Dunque devi sempre iniziare dal primo elemento (di cui non devi perdere il riferimento, che è in pratica il riferimento dell'intera lista) e poi devi fare un ciclo.
    Ad esempio, per accedere all'n-esimo elemento:

    codice:
    //Sia ref il riferimento al primo oggetto della lista
    for (int i=1, Oggetto o=ref; i<n; i++)  {
         o=o.referenza();
    }
    //o è il riferimento all'n-esimo oggetto

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    56
    Comunque il modo con cui crei i nuovi elementi della lista mi pare non funzionare: crei due volte un nuovo Oggetto e poi non imposti in nessuno degli elementi della lista già esistenti il riferimento al nuovo elemento.

    Una considerazione (IMHO): l'approccio non è molto OO. Dovresti creare una classe che rappresenta la lista, che abbia i metodi add(Object o), remove(Object o), contains(Object o), size() e get(int i).
    L'elemento generico (il tuo Oggetto) non ti serve: hai già Object.
    Poi, per mostrare che la lista funziona, scrivi un programma che la usa (il tuo main), che però non deve contenere la logica su come si aggiunge o si recupera un elemento.

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.