Richiesta informazioni

di il
34 risposte

34 Risposte - Pagina 2

  • Re: Richiesta informazioni

    FabioJ ha scritto:


    Ho creato una classe Persona con tre attributi nome, cognome , annodinascita.
    Ho implementato la classe persona parametrizzandola con Comparable<Persona> e ho aggiunto il metodo comapareTo(),( credo sia obbligatorio metterlo) .
    Fin qui ok. Nota: i campi li hai messi public. Mentre invece sarebbe meglio se li tieni private.

    Il compareTo va messo poiché imposto dalla interfaccia. Dato che la interfaccia è stata usata parametrizzata, allora il parametro del compareTo può essere del tipo della parametrizzazione, Persona appunto. Il nome del parametro, arg0, non è il massimo, metti ad esempio altraPersona che è più sensato.

    Ora resta da implementare compareTo in modo appropriato. All'interno del compareTo hai 2 oggetti Persona: uno è rappresentato (implicitamente) dal this (l'oggetto su cui è invocato compareTo) e l'altro è rappresentato dal Persona ricevuto in argomento.

    Il compareTo deve restituire:
    - un valore < 0 se il Persona this è "minore" dell'altra Persona
    - un valore = 0 se il Persona this è "uguale" all'altra Persona
    - un valore > 0 se il Persona this è "maggiore" dell'altra Persona

    Come detto prima, essendo l'ordinamento "naturale", la cosa sensata/logica è l'ordinamento per cognome/nome. Sono entrambi String. Cosa ha String per la comparazione? Guarda la sua documentazione javadoc.

    Quindi: prima confronti i due cognomi. Se uno dei due è minore/maggiore dell'altro, hai GIA' la risposta, non devi fare altri confronti. Se invece sono uguali, allora in tal caso confronti i due nomi.
  • Re: Richiesta informazioni

    Nella seconda parte dell'esercizio mi si presenta un errore :
    Per prima cosa provo come faccio di solito di crearmi 4 oggetti di tipo Persona p,p1,p2,p3.
    Poi provo a creare un ArrayList paraemtrizzato a String e provo a creare degli oggetti con per esempio Str.add("fabio") , cosi' va bene pero' se scrivo Str.add("fabio","pincopallino",1966) va in errore . Non dovrebbe essere l'oggetto Persona composto da due stringhe con un intero?



    import java.util.ArrayList;

    public class main {

    public static void main(String[] args) {

    Persona p = new Persona("Fabio", "Pincopallino", 1966);
    Persona p1 = new Persona("Franco", "Rossi", 1969);
    Persona p2 = new Persona("Gianni", "Bianchi", 1980);
    Persona p3 = new Persona("Alfonso", "Verdi", 1989);


    ArrayList<String> Str = new ArrayList<String>();

    Str.add("Fabio");

    Str.add("Fabio", "Pincopallino", 1966);
    Str.add("Franco", "Rossi", 1969);
    Str.add("Gianni", "Bianchi", 1980);
    Str.add("Alfonso", "Verdi", 1989);






    }

    }
  • Re: Richiesta informazioni

    Andbin .
    Prima di affrontare la seconda parte dell'esercizio devo risolvere i problemi che mi hai postato .
    Non mi sono accorto che mi avevi risposto percio' e' meglio lasciare perdere per il momento il main .
  • Re: Richiesta informazioni

    FabioJ ha scritto:


    Per prima cosa provo come faccio di solito di crearmi 4 oggetti di tipo Persona p,p1,p2,p3.
    E questo è ok.

    FabioJ ha scritto:


    Poi provo a creare un ArrayList paraemtrizzato a String e provo a creare degli oggetti con per esempio Str.add("fabio") , cosi' va bene pero' se scrivo Str.add("fabio","pincopallino",1966) va in errore .
    La lista l'hai fatta ArrayList<String> . Non ha senso se vuoi gestire oggetti Persona!

    Quindi: la lista falla ArrayList<Persona> e allora potrai aggiungere i p, p1, ecc... nella lista.
  • Re: Richiesta informazioni

    Vorrei capire bene questo passaggio pero' mi rimane difficile .

    tu mi scrivi :

    Ora resta da implementare compareTo in modo appropriato. All'interno del compareTo hai 2 oggetti Persona: uno è rappresentato (implicitamente) dal this (l'oggetto su cui è invocato compareTo) e l'altro è rappresentato dal Persona ricevuto in argomento.


    E' sbagliato correggere il metodo compareTo() in questo modo ?

    @Override

    public int compareTo( Persona AltraPersona) {

    return nome - AltraPersona.nome;
    return cognome - AltraPersona.cognome;
    return annodinascita - AltraPersona.annodinascita;
    }
  • Re: Richiesta informazioni

    Forse ho capito.

    Dovrebbe essere una cosa di questo tipo:

    int r = string1.compareTo(string2);

    poi eseguo gli if
  • Re: Richiesta informazioni

    FabioJ ha scritto:


    Per comparare le string devo usare equals .
    NO! Guarda bene il javadoc di String.
  • Re: Richiesta informazioni

    Forse ho capito.

    Dovrebbe essere una cosa di questo tipo:

    int r = string1.compareTo(string2);

    poi eseguo gli if
  • Re: Richiesta informazioni

    FabioJ ha scritto:


    int r = string1.compareTo(string2);

    poi eseguo gli if
    Sì. E ne basta 1 di if e con il solo corpo per il ramo true (non serve alcun else, detto in altro modo)
  • Re: Richiesta informazioni

    Adesso pero' viene il bello .
    Come mettere in pratica questa operazione ? .
    Questo e' quello che sono riuscito a scrivere ..



    @Override
    public int compareTo(Persona AltraPersona) {

    int r = this.nome.compareTo(AltraPersona.nome)&& this.cognome.compareTo(AltraPersona.cognome ) && this.annodinascita.compareTo(AltraPersona.annodinascita);

    if ( r > 0 ) { // string1 precede string2 }
    if ( r < 0 ) { // string1 segue string2 ? }
    if ( r == 0 ) { // le stringhe sono uguali }

    return 0;
    }
  • Re: Richiesta informazioni

    FabioJ ha scritto:


    @Override
    	public int compareTo(Persona AltraPersona) {
    			
    		int r = this.nome.compareTo(AltraPersona.nome)&& this.cognome.compareTo(AltraPersona.cognome ) && this.annodinascita.compareTo(AltraPersona.annodinascita); 
    
    		if ( r > 0 ) {  //   string1 precede string2   }    
                    if ( r < 0 ) {  //   string1 segue string2 ? }  
                    if ( r == 0 )  { // le stringhe sono uguali  }
    		
    		return 0;
    	}
    No no no, mi spiace. Non serve tutta questa roba. Non servono < > ==, non servono AND (&&), non servono più if.

    Non ti scrivo io la soluzione (sono 3/4 righe in croce) ... vediamo di farti "ragionare".

    Hai visto che String ha un int compareTo(String) perché è Comparable<String>. Interessa solamente il metodo, ovviamente, che userai direttamente.

    Partiamo dal cognome. Prendi i due cognomi String e li compari con compareTo. Nota: meglio se usi i getter invece che direttamente i campi.
    Il risultato della comparazione lo puoi assegnare ad una variabile appunto int r .

    Se ci fosse solo il cognome da confrontare, avresti già finito, questo r sarebbe direttamente il valore da restituire (e anzi, non servirebbe nemmeno tenere una variabile per questo!).

    Ma vogliamo basare l'ordinamento su cognome E nome. E l'ho detto prima ma lo ripeto: il nome ha senso confrontarlo SOLO a parità di cognome! Quando è che sai (da compareTo) che i due valori sono uguali?? Bene, in quel caso confronti i due nomi.

    E nota: a quel punto puoi riassegnare il nuovo risultato sempre a quella r .

    Più chiaro??
  • Re: Richiesta informazioni



    In questo modo posso avere due variabili di confronto , r e r1 .... pero' credo sia necessario mettere un if su r1 per poi comaparare i nomi .
    Intanto vorrei essere sicuro di aver preso la strada giusta poi provo a mettere l' if dopo la comparazione del cognome.


    @Override
    public int compareTo(Persona AltraPersona) {

    int r = this.getNome().compareTo(getNome());

    int r1 = this.getCognome().compareTo(getCognome());

    return r ;

    }
  • Re: Richiesta informazioni

    FabioJ ha scritto:


    In questo modo posso avere due variabili di confronto , r e r1
    Non servono 2 variabili. Ne basta una.

    FabioJ ha scritto:


    pero' credo sia necessario mettere un if su r1 per poi comaparare i nomi .
    L'ho detto prima: si confrontano i nomi SOLO A PARITA' di cognomi. Quindi è praticamente scontato un if.
  • Re: Richiesta informazioni

    Non ci arrivo .. la butto li


    public int compareTo(Persona AltraPersona)
    {
    r1 = this.getCognome().compareTo(getCognome());

    if ( r1 == 0 ) { // return qualcosa } else

    this.getnome().compareTo(nome());
  • Re: Richiesta informazioni

    public int compareTo(Persona altraPersona) {
        int r = getCognome().compareTo(altraPersona.getCognome());
    
        if (r == 0) {
            r = getNome().compareTo(altraPersona.getNome());
        }
    
        return r;
    }
    Tutto qui. Così è "pulito" e chiaro (si nota bene che il confronto dei nomi è in "cascata" solo per parità di cognomi).
    Se si vuole, si può fare in modo ultra-compatto sfruttando l'operatore "condizionale".
    public int compareTo(Persona altraPersona) {
        int r = getCognome().compareTo(altraPersona.getCognome());
        return r != 0 ? r : getNome().compareTo(altraPersona.getNome());
    }
    Questione di gusti ....
Devi accedere o registrarti per scrivere nel forum
34 risposte