java - 比较方法违反了它在 Java 7 中的一般约定

标签 java

在 Java 7 中编译一些 Java 代码然后运行它后,我得到一个“比较方法违反其一般契约(Contract)”。

我已阅读 Comparison method violates its general contract! Java 7 only并意识到我的代码有问题,在以前的 Java 版本中被忽略了。但是我无法弄清楚我的代码有什么问题。 Collections.sort() 会产生错误。

我的代码是:

   public Comparator sortBySmoothDays() {
    Comparator c = new Comparator() {
        public int compare(Object arg0, Object arg1) {
            Date date0 = ((PosObject)arg0).getDate();
            Date date1 = ((PosObject)arg1).getDate();

            double d1 = MyUtils.calcSmoothDays(date0, new Date());
            double d2 = MyUtils.calcSmoothDays(date1, new Date());
            if (d1 >= d2) {
                return 1;
            }
            else {
                return -1;
            }   
        }
    };
    return c;
}


Comparator c = ComparatorUtils.getInstance().sortBySmoothDays();
Collections.sort(posList, c);

有人可以帮忙吗?谢谢!

最佳答案

如果值相等,比较器必须返回 0。在您当前的实现中,如果它们相等,则返回 1。正确比较 double 值的最简单方法是调用 Double.compare :

double d1 = MyUtils.calcSmoothDays(date0, new Date());
double d2 = MyUtils.calcSmoothDays(date1, new Date());

return Double.compare(d1, d2);

关于java - 比较方法违反了它在 Java 7 中的一般约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9486605/

相关文章:

java - JGit 和寻找头部

java - 应用程序重新启动后显示用户输入的数据

java bytebuffer slice 不按照文档工作

java - 静态分析期间检查/放置错误的非原子使用

java - 如何根据系统属性 'environment' 运行特定的测试类?

java8 将数学运算符应用于函数的可能性

java - 如何使用条目从 ListView 中获取特定键的值

Java——最高效的匹配方法

java - 为什么 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的

java - 在 JUnit 中测试 REQUIRES_NEW