|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2003
Messaggi: 180
|
[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: 180
|
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: 180
|
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: 180
|
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: 19:32.



















