HashSet w porównywaniu obiektów?

HashSet w porównywaniu obiektów?
EI
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

Chce zrobić prostą rzecz, sprawdzić czy HashSet zawiera obiekt:

Kopiuj
Area a = DAO.AreaDAO.getAreaById(Integer.valueOf(index));    
       Set<Question> questions = new HashSet<Question>(0);
       questions = a.getQuestions();       
       boolean x = questions.contains(question);

No i niestety zwracana wartość to zawsze false. Jeśli wydrukuje sobie porównywaną listę obiektów i sam obiekt wszystko się zgadza:

Szukany obiekt: Question{id=19, version=1, description=Pytanie 19}
Wartości w HashSet: [Question{id=19, version=1, description=Pytanie 19}, Question{id=18, version=1, description=Pytanie}]

Nie wiem dlaczego nie wyszukuje mi tego obiektu?

NoZi
  • Rejestracja:około 16 lat
  • Ostatnio:25 dni
1

A jak nadpisałeś hashcode i equals?


Hate the sin, love the sinner
EI
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0
Kopiuj
  public int hashCode() {
        return (int)this.id;
    }
  
   public boolean equals(Question other) {
        return (int)this.id == (int)other.id;
    }
EI
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

Zmieniłem na jakieś takie bardziej ambitne i jest ok:

Kopiuj
@Override
public int hashCode(){
    StringBuffer buffer = new StringBuffer();
    buffer.append(this.id);
    buffer.append(this.version);
    buffer.append(this.description);
    buffer.append(this.active);
    return buffer.toString().hashCode();
}


@Override
public boolean equals(Object object){
    if (object == null) return false;
    if (object == this) return true;
    if (this.getClass() != object.getClass())return false;
    Question questions = (Question)object;
    if(this.hashCode()== questions.hashCode())return true;
   return false;
}  
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 6 godzin
2
Kopiuj
       Set<Question> questions = new HashSet<Question>(0);
       questions = a.getQuestions();      

Szkolny błąd - po co tworzysz HashSet, skoro go w następnej linijce wywalasz? a.getQuestions() zwraca jakąś implementację Seta, nie musi to być HashSet.

Zamiast tego możesz po prostu napisać:

Kopiuj
       Set<Question> questions = a.getQuestions();      

Wyjdzie na to samo, ale nie będziesz tworzył śmiecia w pamięci.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.