尝试使用类似的界面进行自定义排序时出现异常

时间:2017-11-28 11:41:27

标签: java

我正在尝试使用类似的界面编写自定义排序功能。

我的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函数让我知道这个问题。

1 个答案:

答案 0 :(得分:0)

以下是Oracle Javadoc page的引用:

  

强烈建议(尽管不要求)自然排序与equals一致。这是因为没有显式比较器的有序集(和有序映射)表现得很奇怪&#34;当它们与自然顺序与equals不一致的元素(或键)一起使用时。特别是,这样的有序集(或有序映射)违反了set(或map)的一般契约,它是根据equals方法定义的。

     

例如,如果添加两个键a和b使得(!a.equals(b)&amp;&amp; a.compareTo(b)== 0)到不使用显式比较器的有序集合,第二个add操作返回false(并且有序集的大小不会增加),因为a和b在排序集的透视图中是等效的。

因此,请检查您的班级是否已填写此合同。

Long转换为int时,问题在于精度损失。 您可以检查一下,如果您班级的xy对象遵循以下内容:

  

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