gpt4 book ai didi

java - 比较Java中的两个比较器对象

转载 作者:行者123 更新时间:2023-11-29 05:51:34 25 4
gpt4 key购买 nike

如果我执行以下操作

myObject.myMethod(myClass.getComparator());

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

在我的类(class)

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

那么“//do sth”不会被执行。所以我两次getComparator得到的对象是不一样的。怎么可能?有机会看到哪个比较器“myMethod”得到了吗?

最佳答案

你在这一行调用了 equals 方法:

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

由于您没有在 Comparator 类(这是一个匿名内部类)上显式定义此方法,因此默认为从 Object 继承的版本 - 只有当两个引用是完全相同的对象。

而您的 getComparator() 方法状态为 return new Comparator() { ... },因此它调用构造函数并在每次调用时创建一个新对象。因此,一次调用 getComparator 的结果将是一个不同的对象,因此不会被视为等于另一次调用的结果。

我可以想到两种可能的方法来更改您的代码,以便相等性测试返回 true:

  1. 只创建一次比较器,并从获取比较器。这将涉及一个有点像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() 实现)。然后,您可以准确控制哪些对象被认为等于您的比较器之一。如果您为比较器定义一个具体类而不是匿名内部类,这可能会容易得多。


不过,归根结底,我担心您的方法可能不正确。两个比较器彼此相等意味着什么?我觉得这对于数据类以外的任何事物来说都是一个模棱两可的概念,我会犹豫是否为此使用 Object.equals 方法。

(例如,如果您所说的相等是指“它们将按相同顺序对列表进行排序”,那么我会向您的比较器类添加一个名为 isEquivalentSortOrder 或类似名称的方法。这样您可以准确地说明你的意思,而不必依赖“相同”的模糊定义。)

关于java - 比较Java中的两个比较器对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13683363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com