我需要實現equals()方法可以放在它的HashSet的一個項目的Maker.The項目可以有字段如下平等項目的
class Item{
private String isbn;
private String name;
private double price;
...
}
class Maker{
private String name;
private Set<Item> items;
public Maker() {
super();
items = new HashSet<Item>();
}
...
}
如果我實現由等於比較這三個字段,寫基於這些字段的hashCode(),我會得到錯誤的結果時
1.add item to hashset
2.modify the price of item
3.try to find if item exists in hashset
@Override
public boolean equals(Object o){
if(o == this){
return true;
}
if (!(o instanceof Item)){
return false;
}
Item a = (Item)o;
if(hasSameName(a) && hasSameIsbn(a) && hasSamePrice(a)){
return true;
}
else{
return false;
}
}
@Override
public int hashCode(){
int hash = 41 + this.isbn.hashCode();
hash = hash*41+ new Double(this.price).hashCode();
hash = hash*41 + this.name.hashCode();
return hash;
}
...
Set<Item> items = new HashSet<Item>();
Item item1 = new Item();
item1.setName("crystal bird");
item1.setIsbn("1111");
item1.setPrice(120.5);
items.add(item1);
System.out.println(items.contains(item1));//returns true
item1.setPrice(177.0);
System.out.println(items.contains(item1));//returns false
什麼是克服這種解決辦法嗎?我應該做的hashCode()只依賴於ISBN並且假設它在物品的使用期限內不會改變。
任何幫助讚賞
mark。