Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较法违反了排序法的总合同_Java_Android_Sorting - Fatal编程技术网

Java 比较法违反了排序法的总合同

Java 比较法违反了排序法的总合同,java,android,sorting,Java,Android,Sorting,我的排序方法有一个错误 比较法违反其总合同 这是我的排序对象与排序方法 public abstract class ComparablePerson extends IDValueItem implements Comparable<ComparablePerson> { private int score; private String itemID,itemName; //setters and getters public

我的排序方法有一个错误

比较法违反其总合同

这是我的排序对象与排序方法

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; 
}
公共抽象类ComparablePerson扩展IDValueItem实现
可比{
个人智力得分;
私有字符串itemID,itemName;
//二传手和接球手
公共国际比较(可比人与其他人){
if(score==另一个.getScore())
返回此.getItemName().compareToIgnoreCase(另一个.getItemName());
如果((score)>另一个.getScore())
返回1;
其他的
返回-1;
}
@凌驾
公共布尔等于(对象o){
最终可比人其他=(可比人)o;
if(score==other.getScore()&&this.getItemName().equalsIgnoreCase(other.getItemName()))
返回true;
其他的
返回false;
}
我只是打电话 集合。排序(可比PersonCollection)


这可能是什么原因?

方法实现的
compareTo
equals
似乎不一致,错误是告诉您,对于相同的两个对象,
equals
给出true,而
compareTo
不产生零,这是不正确的。我建议您从调用
compareTo
ode>equals以确保一致性或定义自定义的
比较器

简单地做:

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; 
    }   
}
公共抽象类CompariablePerson扩展IDValueItem实现Compariable{
个人智力得分;
私有字符串itemID,itemName;
//二传手和接球手
公共国际比较(可比人与其他人){
if(score==另一个.getScore())
返回此.getItemName().compareToIgnoreCase(另一个.getItemName());
如果((score)>另一个.getScore())
返回1;
其他的
返回-1;
}
@凌驾
公共布尔等于(对象o){
返回比较器到(o)==0;
}   
}

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

简单地做:

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; 
    }   
}
公共抽象类CompariablePerson扩展IDValueItem实现Compariable{
个人智力得分;
私有字符串itemID,itemName;
//二传手和接球手
公共国际比较(可比人与其他人){
if(score==另一个.getScore())
返回此.getItemName().compareToIgnoreCase(另一个.getItemName());
如果((score)>另一个.getScore())
返回1;
其他的
返回-1;
}
@凌驾
公共布尔等于(对象o){
返回比较器到(o)==0;
}   
}

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" );
   }
}
公共类ComparablePerson实现Comparable{
公共可比人员(整数分数、字符串名称){
_分数=分数;
_itemName=名称;
}
@覆盖公共整数比较到(可比较的人另一个){
int delta=_分数-另一个。_分数;
如果(delta!=0)返回delta;
返回_itemName.compareTignoreCase(另一个._itemName);
}
@重写公共布尔等于(对象o){
返回0==compareTo((可比人)o);
}
@重写公共int hashCode(){
返回super.hashCode();
}
私人期末综合分数;
私有最终字符串_itemName;
公共静态void main(字符串[]args){
ListoSet=newlinkedlist();
新增(新的可比人士(5,“x”);
增加(新的可比人士(5,“y”);
新增(新的可比人士(5,“z”);
增加(新的可比人士(6,“x”);
新增(新的可比人士(6,“y”);
增加(新的可比人士(6,“z”);
集合。排序(oSet);
系统错误打印项次(“正常”);
}
}

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" );
   }
}
公共类ComparablePerson实现Comparable{
公共可比人员(整数分数、字符串名称){
_分数=分数;
_itemName=名称;
}
@覆盖公共整数比较到(可比较的人另一个){
int delta=_分数-另一个。_分数;
如果(delta!=0)返回delta;
返回_itemName.compareTignoreCase(另一个._itemName);
}
@重写公共布尔等于(对象o){
返回0==compareTo((可比人)o);
}
@重写公共int hashCode(){
返回super.hashCode();
}
私人期末综合分数;
私有最终字符串_itemName;
公共静态void main(字符串[]args){
ListoSet=newlinkedlist();
新增(新的可比人士(5,“x”);
增加(新的可比人士(5,“y”);
新增(新的可比人士(5,“z”);
增加(新的可比人士(6,“x”);
新增(新的可比人士(6,“y”);
增加(新的可比人士(6,“z”);
集合。排序(oSet);
系统错误打印项次(“正常”);
}
}