【问题标题】:Exception when trying to do custom sort using comparable interface [duplicate]尝试使用可比较的界面进行自定义排序时出现异常[重复]
【发布时间】:2017-11-28 20:09:31
【问题描述】:

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

我的 compareTo 函数如下:

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

当我尝试对 myClass 对象列表进行排序时遇到以下异常。

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 函数的问题。

【问题讨论】:

标签: java


【解决方案1】:

以下引自Oracle Javadoc page:

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

例如,如果一个添加两个键 a 和 b 使得 (!a.equals(b) && a.compareTo(b) == 0) 到一个不使用显式比较器的排序集,第二个添加操作返回 false(并且排序集的大小不会增加),因为从排序集的角度来看 a 和 b 是等价的。

所以,请检查您的班级是否已满员。

问题在于从Long 转换为int精度损失。 您可以在最后检查您班级的对象 xy 是否遵循以下内容:

如果x.equals(y)true,那么y.equals(x) 也是true,反之亦然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多