Help Java

di il
35 risposte

35 Risposte - Pagina 2

  • Re: Help Java

    andbin ha scritto:


    AleX3mE ha scritto:


    ma stampa: [Quadrato@106d69c, Quadrato@52e922, Quadrato@25154f, etc.
    Sugli oggetti contenuti viene invocato toString(). La tua classe Quadrato non ridefinisce toString() (rimane il toString() "ereditato" da Object che sa solo fornire quella forma tipo Quadrato@25154f). L'avevo già detto prima: ridefinisci toString() per fornire una descrizione significativa e utile dell'oggetto (es. Quadrato[lato=xxxx] )

    Il toString lo devo definire nel costruttore giusto?
    Ho fatto in questo modo:
    public void toString(int lato)
    {
    this.lato = lato;
    }
    }

    ma ristampa sempre la stessa cosa.
  • Re: Help Java

    AleX3mE ha scritto:


    Il toString lo devo definire nel costruttore giusto?
    No, non c'entra nulla il costruttore. Il toString() è un metodo come un altro ... solo che DEVE avere una forma ben precisa affinché sia un "override" di quello di Object.

    public String toString() {
    //.... crea e restituisci una rappresentazione in stringa dell'oggetto
    }

    Questa deve essere la forma
  • Re: Help Java

    Quindi sarebbe:

    public String toString()
    {
    return //cosa ci metto qui?
    }

    e può essere messo in qualsiasi parte?
  • Re: Help Java

    AleX3mE ha scritto:


    return //cosa ci metto qui?
    Ci metti la composizione di una stringa, con parti fisse più chiaramente i valori dei campi di interesse (nel tuo caso il campo lato).

    AleX3mE ha scritto:


    e può essere messo in qualsiasi parte?
    In che senso? Va messo nella classe Quadrato. Dove non è importante, basta che sia allo stesso livello di altri metodi. Metti il toString() ad esempio al fondo della classe.
  • Re: Help Java

    andbin ha scritto:


    AleX3mE ha scritto:


    return //cosa ci metto qui?
    Ci metti la composizione di una stringa, con parti fisse più chiaramente i valori dei campi di interesse (nel tuo caso il campo lato).
    mh non ho capito granchè qui, ho provato con cose a caso scrivendo tipo "Lato" e giustamente i 1000 oggetti prendono il nome lato. Visto che a me serve che i 1000 oggetti abbiano un numero da 1 a 20, nel return suppongo ci vada il math random? ma il math random è già stato assegnato alla variabile lato. Ho un attimo di confusione su questo punto

    AleX3mE ha scritto:


    e può essere messo in qualsiasi parte?
    In che senso? Va messo nella classe Quadrato. Dove non è importante, basta che sia allo stesso livello di altri metodi. Metti il toString() ad esempio al fondo della classe.
    Ok infatti l ho messo dopo i metodi getter e setter.
  • Re: Help Java

    AleX3mE ha scritto:


    mh non ho capito granchè qui, ho provato con cose a caso scrivendo tipo "Lato" e giustamente i 1000 oggetti prendono il nome lato. Visto che a me serve che i 1000 oggetti abbiano un numero da 1 a 20, nel return suppongo ci vada il math random? ma il math random è già stato assegnato alla variabile lato. Ho un attimo di confusione su questo punto
    Attento quando citi altri post, altrimenti si rischia di perdere la risposta...

    Se rileggi con attenzione quanto aveva scritto in precedenza andbin, lui suggeriva di restituire una stringa di questo tipo: Quadrato[lato=xxxx].
    Non serve riutilizzare il random di Math, come hai detto tu l'assegnazione del numero casuale al lato è già stata fatta in precedenza.

    Quindi nel toString() basterà restituire il valore già assegnato alla variabile lato, poi puoi comporre la stringa come vuoi, ma ha senso seguire il consiglio sopra riportato e specificare nella stringa di ritorno che l'oggetto in questione è un Quadrato (se restituisci solo un numero che rappresenta il lato devi perlomeno fare attenzione a non confonderlo con altre possibile stampe in futuro).
    Allora, sempre seguendo quanto scritto sopra, il metodo può essere scritto così:
    
    public String toString()
    {
    	return "Quadrato[lato="+String.valueOf(this.lato)+"].";
    }
    
  • Re: Help Java

    Per il toString() la cosa più banale è:
    public String toString() {
        return "Quadrato[lato=" + lato + "]";
    }
  • Re: Help Java

    Ah ok capito ora, però ora il problema è che mi stampa:
    [Quadrato[lato=0]
    non da un numero da 0 a 20 nonostante ho specificato nel for:
    int lato = (int) Math.random()*21;

    Quale potrebbe essere il problema?
  • Re: Help Java

    Ah ok capito ora, però ora il problema è che mi stampa:
    [Quadrato[lato=0]
    non da un numero da 0 a 20 nonostante ho specificato nel for:
    int lato = (int) Math.random()*21;

    Quale potrebbe essere il problema?
  • Re: Help Java

    AleX3mE ha scritto:


    Quale potrebbe essere il problema?
    Alt:

    int lato = (int) Math.random()*21;

    Qui prima fa il cast a int (quindi è sempre 0), poi moltiplica per 21 (0x21 fa sempre 0)
  • Re: Help Java

    Quindi devi dare un valore fuori dal for? però ho provato adesso ma il risultato non cambia.
  • Re: Help Java

    AleX3mE ha scritto:


    Quindi devi dare un valore fuori dal for?
    No, proprio no.

    Devi capire cosa fa

    int lato = (int) Math.random()*21;

    è una questione di "precedenza" degli operatori. Che devi comprendere se vuoi continuare in Java. Il cast è più prioritario della moltiplicazione (in generale delle operazioni matematiche).

    Quindi quella riga è equivalente a

    int lato = ( (int) Math.random() ) * 21;

    Nota le parentesi rosse che ho messo. Visto che random non arriva mai 1 ma al max 0,9999.... un cast a int fa SEMPRE 0. E 0 per 21 ovviamente dà 0.

    Se vuoi un range da 1 a 20 entrambi compresi, allora è questo:

    int lato = (int) (Math.random() * 20) + 1;
  • Re: Help Java

    Ok perfetto grazie mille, ora stampa i 1000 oggetti con lato da 1 a 20. Ora però devo eliminare i duplicati, da quanto ho capito serve un ciclo for e un if giusto?
  • Re: Help Java

    AleX3mE ha scritto:


    Ora però devo eliminare i duplicati, da quanto ho capito serve un ciclo for e un if giusto?
    No, non è così banale/immediato. Ci sono svariate soluzioni, da quelle peggiori come performance fino a quelle più "furbe" ed efficienti.
    Ne dico alcune, giusto quelle che mi vengono in mente ora.
    Presupponiamo di avere una lista di ingresso (con duplicati) e una nuova lista in uscita (senza duplicati).

    a) Per ciascun elemento nella lista in ingresso vai a cercare se esiste nella lista in uscita. Se non c'è lo aggiungi nella lista in uscita, se c'è non fai nulla. Questa è quella peggiore come prestazioni.

    b) Sfrutti una mappa dove la chiave è il lato e il valore è l'oggetto Quadrato. Anche qui, per ciascun elemento nella lista in ingresso vai a vedere se c'è il lato nella mappa. Se non c'è, inserisci. Se c'è non fai nulla. Alla fine metti i valori della mappa in una lista.

    c) Sfrutti un HashSet, butti tutti gli elementi nel HashSet dove non ci possono essere duplicati. Ma il senso del "non ha duplicati" è basato sulla corretta implementazione di equals() e hashCode(). Quindi la tua classe Quadrato DEVE implementare (ridefinire) appropriatamente questi due metodi di Object.
    Alla fine butti il contenuto del HashSet in una lista.

    Scegli tu ...
  • Re: Help Java

    Mh ok, è in che posizione del codice va inserito? dopo il for?
Devi accedere o registrarti per scrivere nel forum
35 risposte