[英]Overriding hashcode method to return hashcode of variable in a class
class UserScoring implements Comparable<UserScoring> {
User user;
int score;
UserScoring(User user, int score) {
this.user = user;
this.score = score;
}
@Override
public int compareTo(UserScoring o) {
if (this.score < o.score) {
return 1;
}
else if (this.score == o.score) {
return 0;
}
return -1;
}
@Override
public int hashCode() {
return user.hashCode();
}
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UserScoring other = (UserScoring) obj;
return user.equals(other.user);
}
}
我想創建一個UserScoring
類,可以根據其可變分數對其排序,並且其唯一性由其用戶確定。
這意味着 :
我在這里有兩個疑問:1.返回與用戶對象相同的UserScoring對象的哈希碼是否錯誤。 在我看來,這肯定是錯的。 但是它會引起什么問題呢?
是否有任何方法可以確保在嘗試添加兩個相同的UserScoring對象時,僅將得分較高的UserScoring對象保留在集合中(而得分較低的對象將被驅逐或不添加)用戶。
UserScoring us1 = new UserScoring(u1, 1000); UserScoring us2 = new UserScoring(u1, 100); Set<UserScoring> set = new HashSet<>(); set.add(us1); set.add(us2);
這個集合如何包含us1而不是us2?
- 返回與用戶對象相同的UserScoring對象的哈希碼是否錯誤。 在我看來,這肯定是錯的。 但是它會引起什么問題呢?
沒錯 在這種情況下,我們說UserScoring
對象的“身份”是關聯的User
對象。 但是,這要求您的equals()
方法還必須遵守此標識約定,因此必須將其實現為return Objects.equal( this.user, other.user )
。
- 是否有任何方法可以確保在嘗試添加同一用戶的兩個UserScoring對象時,將得分較高的UserScoring對象保留在集合中。
我不認為有任何方法可以使用未經修改的HashSet來自動執行此操作,但是您可以提供自己的Set
裝飾器(稱其為RankingSet
),該裝飾器針對基礎Set
已經存在的對象檢查要添加的對象並保留其中一個排名較高。 (在您的情況下,排名是得分。)您可以在interwebz上查找CollectionDecorator,該集合可用於減少所需做的工作:它將使您僅覆蓋add()
方法並讓其余方法將委托給基礎Set
由於您需要能夠比較UserScoring
對象,因此您可能會遇到的另一個問題是equals()
方法與Comparable.compareTo()
返回的結果不一致。 解決此問題的一種方法是不使UserScoring
具有可比性,而是實現一個單獨的Comparator
,該UserScoring
根據用戶的得分比較UserScoring
對象。
(因此, RankingSet
需要接收這樣的Comparator
作為構造函數參數。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.