|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
[Java] Set<MiaClasse> ed equals = duplicati indesiderati.
Salve a tutti,
sono un po' arrugginito in java e mi ritrovo ad usarlo letteralmente dopo secoli (l'ultima che ho usato è la 1.4.2 ![]() Devo modellare un insieme di attributi, quindi niente duplicati. Ho creato la classe Attributo e successivamente una classe ElencoAttributi che estende HashSet<Attributo> (dovrò poi aggiungere dei metodi di utilità per gli oggetti istanza di questa classe che non sono inclusi nelle api di java). Gli oggetti attributo sono molto semplici, questa è la definizione. Codice:
public class Attributo implements Comparable<Attributo>{ public Attributo(int valore) { super(); this.valore = valore; } private int valore; public int getValore() { return valore; } public void setValore(int valore) { this.valore = valore; } public String toString(){ return ""+(char)(this.valore+97); } public boolean equals(Attributo a){ return this.valore==a.getValore(); } public int compareTo(Attributo o){ return this.getValore()-o.getValore(); } } Codice:
ElencoAttributi qwe=new ElencoAttributi(); qwe.add(new Attributo(34)); qwe.add(new Attributo(34)); Questa cosa mi sta dannando perchè oltretutto poi se vado a confrontare, sempre con equals, due oggetti ElencoAttributo, questi mi risultano uguali solo se contengono le stesse identiche istanze di attributo e non se contengono oggetti istanza di Attributo uguali secondo la mia definizione di equals. Siccome ho fatto la prova di usare oggetti Integer al posto degli Attributo e il comportamento stavolta è quello che desidero, dove sto sbagliando?Cosa mi manca da aggiungere? Grazie in anticipo.
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
va ridefinito il metodo hashCode(), che nell' implementazione di Object restituisce la posizione in memoria.
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
l'ho definito così
Codice:
public int hashCode() { return this.valore; }
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
ok, ho capito cos'era.
Il mio equals prendeva come parametro Attributo, mentre per fare l'overriding di quello di Object, dovevo per forza dichiarare il parametro Object e poi fare il downcasting ad Attributo. Corretto?
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Credo che il tuo equals non sia l'equals che viene chiamato dall'add.
Prova con: Codice:
@Override public boolean equals(Object o) { if(this == o) return true; if(!(o instanceof Attributo)) return false; Attributo a = (Attributo)o; return valore == a.getValore(); }
__________________
iMac 27" 5K |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
yeah, just in time! adesso funziona! Sta cosa mi ha fatto uscire di capoccia. Beh grazie ad entrambi.
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:17.