当前位置: 首页 > 知识库问答 >
问题:

Java错误:Java . lang . illegalargumentexception:比较方法违反了它的一般约定

易招
2023-03-14

我正在开发一个旧的应用程序,最初是在Java6编写的,几年前升级到Java7。

在这个应用程序中,我使用集合。通过实现比较器接口,使用自定义比较方法对列表进行排序。列表中的对象类型是Company附表,它具有3个属性comanyName计划到期日期

列表可以包含多个具有相同comanyName但具有唯一过期日期的对象。下面的比较函数按公司名称的升序对列表进行排序,并在同一公司名称列表中按过期日期的降序进行排序。下面是方法实现。

    public int compare(CompanySchedule c1, CompanySchedule c2) {
        int returnVal = 0;
        int value = c1.getCompany().getName().compareTo(c2.getCompany().getName());
        if (value == 0){
            if (c1.getUseExpirationDate() == null || c2.getUseExpirationDate() == null){
                returnVal = -1;
            }
            else{
                int chkdate = c1.getUseExpirationDate().compareTo(c2.getUseExpirationDate());
                if (chkdate == 0){
                    returnVal = 0;
                }
                else if (chkdate > 0){
                    returnVal = -1;
                }
                else if (chkdate < 0){
                    returnVal = 1;
                }
            }
        }
        else if (value < 0){
            returnVal = -1;
        }
        else if (value > 0){
            returnVal = 1;
        }


        return returnVal;
    }

我知道,当在上面的比较方法实现中不满足可传递属性时,将抛出错误java.lang.IllegalArgumentException:比较方法违反了它的一般约定

有人可以帮助确定此方法将违反传递属性的位置。感谢您的帮助。

共有2个答案

段哲圣
2023-03-14

我知道我已经迟到了,一旦我找到了解决方案,我基本上忘记了我问过这个问题。正如我所提到的,应用程序是用Java 6编写的,然后根据我对Collections内部实现的理解,升级到Java 7

Sort方法将使用的算法从Merge Sort更改为Tim Sort,Merge Sort忽略比较方法实现的Transitivity属性,Tim sort要求compare方法实现是可传递的,否则会抛出上述异常,因为我们有一个遗留应用程序,我们不想更改代码中的任何内容,所以我们使用了<code>jvm</code>argument<code>java.util.Arrays。useLegacyMergeSort=true在排序实现中内部合并排序

陶温书
2023-03-14

我认为这里有一个问题:

if (c1.getUseExpirationDate() == null || c2.getUseExpirationDate() == null){
                returnVal = -1;
}

如果a.getUseExpirationDate()==null,同时b.getUseExpirationDate=()==null,您将得到

这会破坏一致性。这种方法可能还有更多问题,但我还没有全部检查。

祝你好运。

编辑

这个代码怎么样?

public int compare(CompanySchedule c1, CompanySchedule c2) {
        int returnVal = 0;
        int value = c1.getCompany().getName().compareTo(c2.getCompany().getName());
        if (value == 0) {
            if (c1.getUseExpirationDate() == null && c2.getUseExpirationDate() != null) {
                returnVal = -1;
            } else if (c1.getUseExpirationDate() != null && c2.getUseExpirationDate() == null) {
                returnVal = 1;
            } else if (c1.getUseExpirationDate() == null && c2.getUseExpirationDate() == null) {
                returnVal = 0;
            } else {
                int chkdate = c1.getUseExpirationDate().compareTo(c2.getUseExpirationDate());
                if (chkdate == 0) {
                    returnVal = 0;
                } else if (chkdate > 0) {
                    returnVal = -1;
                } else if (chkdate < 0) {
                    returnVal = 1;
                }
            }
        } else if (value < 0) {
            returnVal = -1;
        } else if (value > 0) {
            returnVal = 1;
        }


        return returnVal;
    }

为了可比性,我尽量不对其进行太多更改,但应该对其进行重构。基本上,它确定空值小于其他值。

 类似资料:
  • 问题内容: 您好,以下是我的比较器的比较方法。我不确定是什么问题。我在堆栈溢出时查找了其他类似标题的问题和答案,但不确定我的方法有什么问题,但我一直在获取java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 任何帮助将不胜感激 添加我得到的异常 问题答案: 您的方法 不是可 传递的 。如果和,则必须等于。 现在考虑这种情况: 对于,和,假设方法返回以下

  • 嗨,下面是我的比较器的比较方法。我不知道哪里出了问题。我查了关于堆栈溢出的其他类似标题的问题和答案,但不确定我的方法有什么问题,但我不断得到java.lang.IllegalArgument异常:比较方法违反了它的一般合同! 任何帮助将不胜感激 添加我得到的异常

  • 我所拥有的 我有此代码,用于根据名称,日期或大小对文件进行排序。 但我得到了这个错误, 我的一些用户得到了这个错误,我在崩溃报告中看到了它。但我自己无法以任何方式重现这个错误。 任何人都可以帮助我找到问题。我似乎真的花了很多时间,但找不到任何东西。请帮我吗? 提前谢谢。

  • 使用自定义比较器执行< code > Collection.sort using >时,我得到一个< code > Java . lang . illegalargumentexception:Comparison方法违反了它的一般约定 我理解这是一个问题,因为该方法是不可传递的。在我的比较器中,调用了多个方法,我确定了违反此规则的代码段。然而,我无法修复它,也看不到它的问题。

  • 问题内容: 我有以下代码: 每次我运行此代码时,都会出现此错误: 我使用OpenJDK7u3,当对象相等时返回0。有人可以向我解释这个错误吗? 问题答案: 如果您有任何NaN值,则可能会遇到这种情况: 例如: 所有 这些打印。因此,您可能会遇到以下两种情况:两个非NaN值都被认为与NaN“相等”,但是一个大于另一个。基本上,您应该弄清楚如何处理NaN值。当然,还要检查这确实是问题所在……您是否真的

  • 一切似乎都运行良好(几天),但我只遇到了一次问题,并且很难重现该问题。 “比较方法违反了其总合同!”被抛出,完全让我措手不及。我有以下几点: 我的染色体类别: 我有一个ArrayList,我使用了两个Collections。排序(MyList)和集合。排序(MyList,Collections.reverseOrder())。到目前为止,他们仍在正常工作。我在100次跑步中只遇到过一次错误。这个实