0

ソート方法でエラーが発生します。

比較方法が約款に違反している

これは、並べ替えメソッドを使用した並べ替えオブジェクトです

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); を呼び出すだけです。

これの原因は何ですか?

4

2 に答える 2

2

compareToequalsメソッドの実装が矛盾しているようです。エラーは、同じ 2 つのオブジェクトに対してtrueequalsを返しcompareToますが、0 を生成しないことを示しています。これは正しくありません。compareTofromを呼び出し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; 
    }   
}
于 2012-12-07T13:04:46.877 に答える
1

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" );
   }
}
于 2012-12-07T13:14:20.623 に答える