【问题标题】:Comparison method violates its general contract in sorting method比较方法在排序方法中违反了它的一般合同
【发布时间】:2012-12-07 12:59:50
【问题描述】:

我的排序方法出错。

比较方法违反了它的一般约定

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

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);

这可能是什么原因?

【问题讨论】:

    标签: java android sorting


    【解决方案1】:

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

    简单地做:

    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; 
        }   
    }
    

    【讨论】:

      【解决方案2】:

      ComparablePerson 是抽象的,比较方法可能在别处被重载...

      你能发布客户端(拥有集合)和具体类吗?

      这段代码运行良好:

      public class ComparablePerson implements Comparable< ComparablePerson > {
         public ComparablePerson( int score, String name ) {
            _score    = score;
            _itemName = name;
         }
      
         @Override public int compareTo( ComparablePerson another ) {
            int delta = _score - another._score;
            if( delta != 0 ) return delta;
            return _itemName.compareToIgnoreCase( another._itemName );
         }
      
         @Override public boolean equals( Object o ) {
            return 0 == compareTo((ComparablePerson)o);
         }
      
         @Override public int hashCode() {
            return super.hashCode();
         }
      
         private final int    _score;
         private final String _itemName;
      
         public static void main( String[] args ) {
            List< ComparablePerson > oSet = new LinkedList<>();
            oSet.add( new ComparablePerson( 5, "x" ));
            oSet.add( new ComparablePerson( 5, "y" ));
            oSet.add( new ComparablePerson( 5, "z" ));
            oSet.add( new ComparablePerson( 6, "x" ));
            oSet.add( new ComparablePerson( 6, "y" ));
            oSet.add( new ComparablePerson( 6, "z" ));
            Collections.sort( oSet );
            System.err.println( "Ok" );
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-17
        相关资源
        最近更新 更多