java - 比较方法违反了排序方法中的一般契约

标签 java android sorting

我的排序方法出现错误。

Comparison method violates its general contract

这是我使用排序方法的排序对象

public abstract class ComparablePerson extends IDValueItem implements
        Comparable<ComparablePerson> {

    private int score;
    private String itemID,itemName;

    //setters and getters

    public int compareTo(ComparablePerson another) {
    if (score == another.getScore())
        return this.getItemName().compareToIgnoreCase(another.getItemName());
    else if ((score) > another.getScore())
        return 1;
    else
        return -1;
}

@Override
public boolean equals(Object o) {
    final ComparablePerson other = (ComparablePerson) o; 

    if (score == other.getScore() && this.getItemName().equalsIgnoreCase(other.getItemName())) 
        return true; 
    else 
        return false; 
}

我只是打电话 Collections.sort(ComparablePersonCollection);

这可能是什么原因造成的?

最佳答案

compareToequals方法实现似乎不一致,错误告诉您对于相同的两个对象 equals给出 true while compareTo不产生零,这是不正确的。我建议您调用compareTo来自equals确保一致性或以其他方式定义自定义 Comparator<T> .

简单地做:

public abstract class ComparablePerson extends IDValueItem implements Comparable<ComparablePerson> {

    private int score;
    private String itemID,itemName;

    //setters and getters

    public int compareTo(ComparablePerson another) {
    if (score == another.getScore())
        return this.getItemName().compareToIgnoreCase(another.getItemName());
    else if ((score) > another.getScore())
        return 1;
    else
        return -1;
    }

    @Override
    public boolean equals(Object o) {
        return compareTo(o) == 0; 
    }   
}

关于java - 比较方法违反了排序方法中的一般契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13763604/

相关文章:

Android - ArrayAdapter<LinearLayout> : The specified child already has a parent. 您必须先在 child 的 parent 身上调用 removeView()

javascript - Canvas 不透明 - 更改默认背景颜色

algorithm - 将多个任意排序的列表合并为一个列表

javascript - 如何在排序之前保存数组的副本?

java - .xsl 文件不会通过浏览器从 tomcat7 下载

java - 如何在 RestAssured 中将基本身份验证作为请求 header 的一部分传递?

Android - Google map 顶部的 float 操作按钮

sorting - mapreduce 分区内的数据是否已排序,如果是,它是如何发生的?

java - 在 CardLayout 中切换面板时如何提醒面板可见

java - 如何将 2.5E7 更改为正常格式的数字?