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

尝试使用可比较接口进行自定义排序时出现异常[重复]

齐航
2023-03-14

我正在尝试使用可比接口编写一个自定义排序函数。

我的compareTo函数如下:

@Override
    public int compareTo(MyClass o) {
        return (int)(this.getTimeInMills() - o.getTimeInMills());
    }

当我试图对我的类对象列表进行排序时,我得到了下面的异常。

28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT java.lang.IllegalArgumentException: Comparison method violates its general contract!
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:866) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:483) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:422) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.ComparableTimSort.sort(ComparableTimSort.java:222) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.Arrays.sort(Arrays.java:1312) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.Arrays.sort(Arrays.java:1506) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.ArrayList.sort(ArrayList.java:1462) ~[?:1.8.0_152]
   2017-11-28T15:02:05.60+0530 [APP/PROC/WEB/0] OUT     at java.util.Collections.sort(Collections.java:141) ~[?:1.8.0_152]

Myclass的实现

public class MyClass implements Comparable<MyClass>{

    private String title;
    private String description;
    private Long timeInMills;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Long getTimeInMills() {
        return timeInMills;
    }

    public void setTimeInMills(Long timeInMills) {
        this.timeInMills = timeInMills;
    }

    @Override
    public int compareTo(MyClass o) {
        return (int)(this.getTimeInMills() - o.getTimeInMills());
    }

}

我在之前的帖子中看到过很多答案,但都没有帮助。有人能告诉我compareTo函数的问题吗。

共有1个答案

申屠亦
2023-03-14

以下是来自Oracle Javadoc页面的引文:

强烈建议(尽管不是必需的)自然排序与equals保持一致。这是因为没有显式比较器的排序集(和排序映射)在与自然排序与equals不一致的元素(或键)一起使用时表现“奇怪”。特别是,这种有序集合(或有序映射)违反了集合(或映射)的一般约定,集合(或映射)是根据equals方法定义的。

例如,如果一个人添加两个键a和b,使得(!a.equals(b)

所以,检查一下你的班级是否已经满了。

问题是从Long转换为int时的精度损失。您可以在结束时检查类中的对象xy是否如下:

如果<代码>x。等于(y)是truey。等于(x)也是true,反之亦然。

 类似资料:
  • 我正试图根据员工的加入日期对他们的列表进行排序。下面是我的员工类。 下面是我的比较器类:

  • 我使用以下算法对 8k 元素列表进行排序。 问题是,虽然按Y坐标排序(第一个比较器)不会产生任何问题(我不知道这是否只是运气问题), 按X坐标(第二个比较器)排序会提示此异常: .我修改了算法,添加了以下内容来打印调试信息: ,这些是异常发生前的最后10个条目: 我从来没有遇到过这样的问题,有人能提供一个解释和解决方案,让这些算法变得可靠吗? 预先非常感谢你的努力 里卡尔多 编辑1:我添加了如下调

  • 问题内容: 父级是子级继承的类。由GrandChild继承。每个类都包含子类的列表(即,父类包含子类的列表,子类包含大子级的列表)。每个类包含50个属性(attrib1-atrib50)。getChildList()返回类型为Child的对象的arrayList getGrandChildList()返回类型为GrandChild的对象的arrayList 令resultSet为父级列表 现在,我

  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这

  • 我有以下清单: 这是我的比较器函数: 我正在尝试使用它排序如下: 我不明白为什么第一个NaN不在列表的末尾。 我对升序排序列表的预期输出是: 我对降序排序列表的预期输出是: 在升序排序和降序排序的情况下,我希望NaNs在最后。 我知道sortwith使我们能够编写自己的比较器。有人能帮我吗?

  • 问题内容: 我想为汽车清单开发一个排序演示。我正在使用数据表显示汽车列表。现在实际上我想按汽车颜色对列表进行排序。这里不是按字母顺序排序的。我想使用我的自定义排序顺序,例如先是红色汽车,然后是蓝色,等等。 为此,我尝试使用,但它只允许按字母顺序排序。 因此,任何人都可以指导我实现使用该技术的方法,以便使排序变得更快。 问题答案: 我建议你为汽车颜色创建一个枚举,而不要使用字符串,并且枚举的自然顺序