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

比较方法违反其一般合同和方法比较

谢泉
2023-03-14

我有一个类联系字段第一名lastName电子邮件。我需要使用Collection.sort(…)对它们进行排序,但我得到了一个异常

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

我的< code>compareTo方法:

    @Override
public int compareTo(Contact another) {
    int compareFirstName = 0;
    if (this.getFirstName() != null && another.getFirstName() != null) {
        compareFirstName = this.getFirstName().compareToIgnoreCase(
                another.getFirstName());

        if (compareFirstName == 0) {
            int compareLastName = 0;
            if (this.getLastName() != null && another.getLastName() != null) {
                compareLastName = this.getLastName().compareToIgnoreCase(
                        another.getLastName());

                if (compareLastName == 0) {
                    int compareEmail = 0;
                    if (this.getEmails() != null
                            && another.getEmails() != null) {
                        compareEmail = this.getEmails()
                                .compareToIgnoreCase(another.getEmails());

                        return compareEmail;
                    } else {

                        return 0;
                    }
                } else {
                    return compareLastName;
                }
            } else {
                int compareEmail = 0;
                if (this.getEmails() != null && another.getEmails() != null) {
                    compareEmail = this.getEmails().compareToIgnoreCase(
                            another.getEmails());

                    return compareEmail;
                } else {

                    return 0;
                }
            }
        } else {

            return compareFirstName;
        }
    } else {
        int compareLastName = 0;
        if (this.getLastName() != null && another.getLastName() != null) {
            compareLastName = this.getLastName().compareToIgnoreCase(
                    another.getLastName());

            if (compareLastName == 0) {
                int compareEmail = 0;
                if (this.getEmails() != null && another.getEmails() != null) {
                    compareEmail = this.getEmails().compareToIgnoreCase(
                            another.getEmails());

                    return compareEmail;
                } else {

                    return 0;
                }
            } else {

                return compareLastName;
            }
        } else {
            int compareEmail = 0;
            if (this.getEmails() != null && another.getEmails() != null) {
                compareEmail = this.getEmails().compareToIgnoreCase(
                        another.getEmails());

                return compareEmail;
            } else {

                return 0;
            }
        }
    }
}

请帮我找出compareTo方法中的错误。谢了。

共有1个答案

杜炫明
2023-03-14

您的实现确实违反了合同。

假设您有3个联系人:

contact1 : First Name = "John", Last Name = "Doe", Email = "x@gmail.com"
contact2 : First Name = "John", Last Name = "Doe", Email = null
contact3 : First Name = "John", Last Name = null, Email = "y@gmail.com"

根据您的逻辑:

contact1.compareTo(contact2)返回0(因为它们的名字和姓氏相同)
contact2.compareTo(contact3)也返回0(因为您只按名字进行比较)
但contact1.compareTo(contact3)不返回0(因为它们有不同的电子邮件)。

< code>compareTo必须是可传递的。

解决此问题的方法是不要忽略仅在您正在比较的联系人之一中为空的属性。例如,如果this.getLastName()==null

 类似资料:
  • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误:

  • 我在尝试对节点的数组列表进行排序时遇到了这个错误。我尝试了大多数解决方案,但没有一个在我的案例中有效。 此代码为 它适用于小输入,但是当输入数量很大时,它会给出这个错误。我也读过比较方法中的传递性规则,但我不知道它是如何在这种情况下应用的。 先谢谢你。

  • 我看到我的应用程序在一些中国 Android 手机上发生了很多崩溃,并出现错误:比较方法违反了其总合同! 我读过这与Collections.sort有关。 我不太确定的是,这是否是因为我的自定义比较器。 以下是错误发生的地方: 比较器是这样的: 所以我不太确定比较器是否搞砸了什么,或者我是否需要以不同的方式进行collections.sort调用 感谢任何帮助

  • 我正在将我们的项目升级到java 7。我遇到了Collections.sort()的非法参数异常。我知道这个异常的原因是java 7中新的Timsort(我确实抛出了之前在这个问题上提出的所有问题)。现在我需要修改比较逻辑来克服这个异常。这是我的比较方法 > < li> 我尝试覆盖equals()方法,使用与compare相同的逻辑,认为如果equals和compare返回相同的结果,应该可以解决

  • 问题内容: 我收到以下错误:“比较方法违反了它的一般约定!” 当使用以下比较器时,但是我无法使用jUnit复制异常。我想知道是什么引起了这个问题以及如何复制它。有一些其他例子也有相同的问题,但没有类似的例子。 通过使用以下代码调用该代码: `` Collections.sort(dtos, new DtoComparator()); ``` 谢谢你的帮助。 额外信息:该错误似乎发生在Java ut

  • 下面是导致异常的代码块,如所示, 代码: 例外情况: 当我将相同的代码作为独立程序运行时,该问题从未出现。这里的比较器有什么问题?有没有办法在独立代码中重现该问题? 这个问题只在Java 1.7上出现,因为Arrays.sort上的实现发生了变化