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

标签 java

如果我执行以下操作

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/

相关文章:

java - com.mysql.cj.jdbc.exceptions.CommunicationsException : The last packet successfully received from the server was XXXXXXXXXXXX milliseconds ago

java - 使用java发送邮件时在地址中添加cc和bcc

java - 使用 System.loadLibrary 加载 Python C 扩展 DLL

java - Solr,如何在 schema.xml 中定义嵌套文档

java - 无法从 War 文件外部找到 application.properties 文件

java - 错误 :java. lang.IllegalStateException:BindingResult 和 bean 名称 'spcrId' 的普通目标对象都不能用作请求属性

涉及 BoxedUnit/void 返回类型的 Java-Scala 互操作问题

java - 用Java做一个Flash风格的网络摄像头网站

java - 算法简单但内存不足

java - 如何在 Java 中创建回调