java.lang.IllegalArgumentException : Comparison method violates its general contract[dup] 异常

标签 java sorting date comparator

<分区>

在尝试了 3 个小时后,我发现所有的解决方案都没有成功,我在这里发布我的问题。我收到异常:

java.lang.IllegalArgumentException: 比较方法违反了它的一般契约

这是我的代码:

public int compare(InstrumentModel o1, InstrumentModel o2) {
    int c = 0;
    if(c == 0 && o1.getUnderlyingAsset()!=null) {
        c = o1.getUnderlyingAsset().compareTo(o2.getUnderlyingAsset());
    }
    if(c == 0 && o1.getSymbol()!=null) {
        c = o1.getSymbol().compareTo(o2.getSymbol());
    }
    if(c == 0 && o1.getExpiryDateInDate()!=null && o2.getExpiryDateInDate()!=null) {
        DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
        Date date1 = null;
        Date date2 = null;
        try {
            date1 = df.parse(df.format(o1.getExpiryDateInDate()));
            date2 = df.parse(df.format(o2.getExpiryDateInDate()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c = date1.before(date2) ? 1 : date1.after(date2) ? -1 : 0 ;
    }
    return c;
}

最佳答案

您对空值的处理不当。

如果比较的 InstrumentModel 之一有一个 null getExpiryDateInDate 而另一个有一个非 null 值,你不应该返回 0。

你应该保持一致。例如:

  • 如果两者都为null,则返回0
  • 如果 o1.getExpiryDateInDate()!=null && o2.getExpiryDateInDate()==null,返回 1
  • 如果 o1.getExpiryDateInDate()==null && o2.getExpiryDateInDate()!=null,返回 -1。
  • 最后,仅当两者都不为 null 时才运行您的日期比较代码以确定要返回的内容。

注意:您对 Assets 和符号属性的 null 处理看起来也不太好,但也许它们永远不会 null (或者至少如果一个有值,另一个也有一个值)。否则,如果 o2.getUnderlyingAsset()null(取决于 getUnderlyingAsset() 的类型及其实现 compareTo 的方式)。

关于java.lang.IllegalArgumentException : Comparison method violates its general contract[dup] 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50924751/

相关文章:

java - junit4 中未找到测试

java - 从文本文件解析 JSON 数据

java - 快速排序算法,需要一些小的说明

python - 如何在不使用 reverse=True 参数的情况下以相反的顺序对字符串列表进行排序?

Android: DateUtils.formatDateTime 改变日期和时间顺序

java - 在 Velocity 文件中将日期格式化为葡萄牙语

java - 如何修复此问题 : cannot find symbol var in StaticTest

java - 在 Java 中操作和比较 float

java - 在 Java 中使用哈希值对数组进行排序

php - 计算每周给出大量 NULL 的记录数