Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    14

    Problema con il metodo equals

    Salve ,
    sono uno studente universitario di ingegneria informatica ed essendo alle prime armi non sono molto pratico del linguaggio java.
    Oggi mi sono appena imbattuto in un problemino con il metodo equals.


    Persona p1 = newPersona("Mario", "Rossi");
    Persona p2 = new Persona("Mario", "Rossi");
    System.out.println(p1.equals(p2));

    Questa porzione di codice dovrebbe restituire true ma restituisce false.
    Ciò non accade per oggetti di tipo String oppure Rectangle.

    Qualcuno sa spiegarmi come risolvere il problema ?
    Grazie in anticipo.
    Ultima modifica di Xert; 20-03-2015 a 22:38

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Xert Visualizza il messaggio
    Questa porzione di codice dovrebbe restituire true ma restituisce false.
    Ciò non accade per oggetti di tipo String oppure Rectangle.
    La tua classe Persona deve ridefinire il metodo public boolean equals(Object o), altrimenti resta solo il equals "ereditato" da Object .... che si basa solo sulla identità (operatore == ) degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    14
    Si ho provato a ridefinire usando HashCode() and equals() ma lo stesso non funziona

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Xert Visualizza il messaggio
    Si ho provato a ridefinire usando HashCode() and equals() ma lo stesso non funziona
    hashCode() serve tipicamente (e quasi esclusivamente) nelle collezioni map o set basate su hash-table (HashMap e simili). Se ridefinisci equals o hashCode, "dovresti" ridefinire anche l'altro (c'è un contratto ben preciso tra i due).

    Comunque senza vedere cosa hai scritto .... non so che dire ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    14
    Spero di non aver scritto stupidaggini


    public class Persona {

    public String nome;
    public String cognome;


    public Persona(String nome, String cognome) {
    // TODO Auto-generated constructor stub
    }

    // TODO Auto-generated method stub

    Persona p1 = new Persona("Mario", "Rossi");
    Persona p2 = new Persona("Mario", "Rossi");




    public boolean equals(Object p2){
    Persona other = (Persona) p2;
    boolean x= nome.equals(other.nome);
    return x;
    }



    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Xert Visualizza il messaggio
    Spero di non aver scritto stupidaggini
    Se è questo che hai scritto .... mancano un po' di cose. Tecnicamente, il equals è corretto. Ma generalmente non si fa così, cioè non si fa un cast diretto e basta (equals non deve schiantarsi lanciando ClassCastException, invece bisognerebbe testare prima il tipo con l'operatore instanceof)
    Il tuo equals comunque confronta solo i nomi ... e oltretutto direttamente sui campi che sono pure public (non è proprio il massimo questo ...).

    Il vero punto che non va è che il costruttore è vuoto, non fa nulla, quindi i campi non vengono inizializzati se fai solo new Persona( .... ). E se i campi restano a null ... allora sì che il equals si schianta, e con NullPointerException.

    E non ho comunque capito cosa ci fanno (e che senso hanno) i Persona p1/p2 lì in mezzo ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    14
    Io vorrei confrontare il contenuto dei due oggetti mediante l equals e farmi restituire il valore true.
    potresti correggermi tu il codice?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Xert Visualizza il messaggio
    Io vorrei confrontare il contenuto dei due oggetti mediante l equals e farmi restituire il valore true.
    potresti correggermi tu il codice?
    Fai la classe Persona così:
    - campi nome/cognome private
    - costruttore che riceve nome/cognome e li assegna ai campi
    - metodi getter/setter public
    - metodo equals che:
    a) testa il Object usando instanceof, es. if (obj instanceof Persona)
    b) Se è un Persona, fai il cast e confronti i nomi e cognomi tra i due oggetti (e ovviamente restituisci true/false). Usa i getter per prendere i valori.
    c) altrimenti restituisci false.

    Se pensi sia difficile ... è più facile di quello che pensi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    14
    public class Persona {

    private String nome;
    private String cognome;



    // TODO Auto-generated method stub






    public String getNome() {
    return nome;
    }


    public void setNome(String nome) {
    this.nome = nome;
    }


    public String getCognome() {
    return cognome;
    }


    public void setCognome(String cognome) {
    this.cognome = cognome;
    }




    public boolean equals(Object obj){
    if(obj instanceof Persona){
    Persona other = (Persona) obj ;
    return nome.equals(other.nome) && cognome.equals(other.cognome);

    }
    else {return false;}
    }
    }


    ----------------------------------------------------------------------------------------------------------------------------------------------------

    public class main {


    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Persona p3 = new Persona();
    p3.setCognome("russo");
    p3.setNome("pasquale");
    Persona p2 = new Persona();
    p2.setCognome("russo");
    p2.setNome("pasquale");
    boolean x = p3.equals(p2);
    System.out.print(x);
    }


    }



    Ho appena risolto senza l'ausilio del costruttore grazie per l'aiuto.
    Comunque io volevo semplicemente fare un confronto tra due oggetti con parametri differenti passati al costruttore.
    Sai spiegarmi il perché non mi funziona così?
    Grazie ancora

  10. #10
    Battuta: Xert ti prego almeno non dire che studi ingegneria informatica!

    Serio:

    se questa è la tua classe:

    codice:
    public class Persona {
    
    public String nome;
    public String cognome;
    
    
    public Persona(String nome, String cognome) {
    // TODO Auto-generated constructor stub
    }
    //.... other methods
    }
    mi spieghi che cosa dovrebbe farci il costruttore con le variabili che passi? Invece

    codice:
    public class Persona{
    
    private String nome;
    private String cognome;
    
    public Persona(String nome, String cognome){
    this.nome = nome;
    this.cognome = cognome;
    }
    
    //getters
    
    //equals and hashcode
    }
    allora si che poi ti funziona l'equals
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

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.