Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di el92
    Registrato dal
    Dec 2014
    Messaggi
    177

    compareTo con nome cognome ed età

    Ciao stao privando a fare una classe di prova per comparare nome,cognome ed eta di una lista di persone.In particolare se nome e cognome coincidono devo comparare l'eta.

    codice:
    import java.util.*;
    class Persona implements Comparable<Persona>{
    String nome;
    String cognome;
    int eta;
    Persona(String nome,String cognome,int eta){
    this.nome=nome;
    this.cognome=cognome;
    this.eta=eta;
    }
    public int compareTo(Persona e){
    int r=nome.compareTo(e.nome);
    if(r==0) {
    r=cognome.compareTo(e.cognome);
    }else if(nome.equals(cognome)){
    r=eta-e.eta;
    }
    return r;
    }
    public boolean equals(Object o){
        String u=(String)o;
        return nome.equals(u);
    }
    public String toString(){
        return ""+nome+","+cognome+","+eta;
    }
    
    public static void main(String args[]){
    Persona e=new Persona("elena","koiploih",23);
    Persona e1=newPersona("alessio","alessio",50);
    Persona e2=new Persona("zalone","airoldi",30);
    ArrayList<Persona>lista=new ArrayList<Persona>();
    lista.add(e);
    lista.add(e1);
    lista.add(e2);
    Collections.sort(lista);
    System.out.println(lista);
    }
    }
    il problema è che se nome e cognome coincidono,il compareTo non mi compara l'eta..perchè?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da el92 Visualizza il messaggio
    il problema è che se nome e cognome coincidono,il compareTo non mi compara l'eta..perchè?
    Semplicemente perché come l'hai implementato, non è corretto. Quando ci sono più attributi su cui basare la comparazione, la logica va fatta "in cascata", cioè continui con i confronti solo se hai uguaglianza. Alla prima disuguaglianza, hai già il risultato finale e non devi andare oltre.

    Con compareTo confronti i due nomi. Se il risultato è diverso da zero, hai già il risultato.
    Altrimenti se è zero, con compareTo confronti i due cognomi. Se il risultato è diverso da zero, hai già il risultato.
    Altrimenti se è zero, confronti le due età (e nota che in Java 7 Integer ha il public static int compare(int x, int y)

    È più semplice e lineare di quello che hai fatto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tra parentesi, anche il metodo equals(), scritto così non ha molto senso (seppur tecnicamente corretto).
    Al metodo equals() ci si aspetta che venga passato un oggetto della stessa classe, non un oggetto di una classe arbitraria (nel tuo caso, un String): non ha molto senso, infatti, comparare Persone con Stringhe (come diceva la mia maestra delle elementari, non si confrontano mele con pere).


    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

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.