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);
系统错误打印项次(“正常”);
}
}