![](/img/trans.png)
[英]comparing two TreeNode (or DefaultMutableTreeNode) objects in Java Comparator
[英]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:
僅創建一次比較器,並從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; }
提供一個顯式的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.