簡體   English   中英

在Java中比較兩個比較器對象

[英]Comparing two comparator objects in Java

如果我做以下事情

myObject.myMethod(myClass.getComparator());

public void myMethod(Comparator<? super myOtherObject> comparator) {
if (comparator.equals(myClass.getComparator()) {
 //do sth
}
}

在myClass中

   static Comparator<ListItem> getComparator() {
        return new Comparator<myOtherObject>() {
            public int compare(myOtherObjectitem1, myOtherObjectitem2) {
                return (Integer.valueOf(myOtherObject.getRating()).compareTo(Integer.valueOf(myOtherObject.getRating())));
            }
        };
    }

那么“//做某事”就不會被執行了。 所以我從getComparator獲得的對象兩次是不同的。 怎么可能? 有沒有機會看到哪個比較器“myMethod”得到了?

你在這一行調用equals方法:

if (comparator.equals(myClass.getComparator())

由於您尚未在Comparator類(這是一個匿名內部類)上顯式定義此方法,因此默認為從Object繼承的版本 - 只有在它們是完全相同的對象時才認為兩個引用相等。

並且你的getComparator()方法聲明return new Comparator() { ... } ,所以它調用構造函數並在每次調用時創建一個新對象。 因此,對getComparator的一次調用的結果將是一個不同的對象,因此不會被視為等於另一個調用的結果。

我可以想到兩種可能的方法來更改代碼,以便相等測試返回true:

  1. 僅創建一次比較器,並從getComparator返回此相同的對象。 這將涉及一個類似於myClass的以下內容的更改:

      private static Comparator<ListItem> cmp = new Comparator<myOtherObject>() { public int compare(myOtherObjectitem1, myOtherObjectitem2) { return (Integer.valueOf(myOtherObject.getRating()).compareTo(Integer.valueOf(myOtherObject.getRating()))); } }; static Comparator<ListItem> getComparator() { return cmp; } 
  2. 提供一個顯式的equals()實現(理想情況下也是一個hashCode() equals()實現)。 然后,您可以精確控制哪些對象被視為與您的一個比較器相等。 如果為比較器定義一個具體類而不是一個匿名內部類,這可能會容易得多。


但是,在一天結束時,我擔心你的做法可能不對。 兩個比較器彼此相等意味着什么? 我覺得這對於除數據類之外的任何事情都是一個模棱兩可的概念,我會對使用Object.equals方法猶豫不決。

(例如,如果相等意味着“他們將以相同的順序對列表進行排序”,那么我會在比較器類中添加一個名為isEquivalentSortOrder或類似的方法。這樣你就可以准確地指定你的意思而不必依賴關於“是一樣的”的羊毛定義。)

為什么不在Comparator myClass靜態變量里面創建:

class myClass{
    public static Comparator<ListItem> = new Comparator<myOtherObject>() {
        public int compare(myOtherObjectitem1, myOtherObjectitem2) {
            ...
        }
    };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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