簡體   English   中英

覆蓋哈希碼方法以返回類中變量的哈希碼

[英]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. 如果我使用Collections.sort()對UserScoring對象的集合進行排序,則希望基於分數按降序排序。 我已經重寫了compareTo方法。
  2. 如果創建一組UserScoring對象,則不需要同一個用戶的兩個UserScoring對象。 我已經覆蓋了equals和hashcode方法。

我在這里有兩個疑問:1.返回與用戶對象相同的UserScoring對象的哈希碼是否錯誤。 在我看來,這肯定是錯的。 但是它會引起什么問題呢?

  1. 是否有任何方法可以確保在嘗試添加兩個相同的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?

  1. 返回與用戶對象相同的UserScoring對象的哈希碼是否錯誤。 在我看來,這肯定是錯的。 但是它會引起什么問題呢?

沒錯 在這種情況下,我們說UserScoring對象的“身份”是關聯的User對象。 但是,這要求您的equals()方法還必須遵守此標識約定,因此必須將其實現為return Objects.equal( this.user, other.user )

  1. 是否有任何方法可以確保在嘗試添加同一用戶的兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM