我试图覆盖compareTo方法以便能够使用Arrays.sort() 但是,当我这样做时,它似乎无法正常工作。
我没有收到任何错误,但我有一个测试人员测试并给出错误。我应该比较' totalsales'来自被比较的项目
以下是比较两个ItemSales项
的方法 @Override
public int compareTo(ItemSales item) {
return Double.compare(item.totalSales, this.totalSales);
}
以下是测试此测试的测试人员,除此之外还有更多,但其他一切甚至可以克隆()。
ItemSales item = new ItemSales();
ItemSales newItem = new ItemSales(10.0, 50, 50.0);
ItemSales secondItem = (ItemSales) newItem.clone();
ItemSales[] myItems = { secondItem, item, newItem };
ItemSales[] myItems = { secondItem, item, newItem };
Arrays.sort(myItems);
if ( myItems[0].getTotalSales() == 860.0 && myItems[1].getTotalSales() == 870.0) {
System.out.println("ItemSalesDemo.main() - sorted, this is correct");
} else {
System.out.println("ItemSalesDemo.main() - ");
System.out.println("ItemSalesDemo.main() ------------------------");
System.out.println("ItemSalesDemo.main() - Error -");
System.out.println("ItemSalesDemo.main() ------------------------");
System.out.println("ItemSalesDemo.main() - item and newItem should have been equal");
System.out.println("ItemSalesDemo.main() - ");
System.exit(-1);
}
你可能知道我得到了"项目,newItem应该是相同的"错误
答案 0 :(得分:3)
我认为如果您更改代码会更好:
@Override
public int compareTo(ItemSales item) {
if (this.totalSales < item.totalSales) {
return -1;
}
else if(this.totalSales > item.totalSales){
return 1;
}
return 0;
}
你之前的Double.compare()的问题在于你的参数顺序错误,应该是比较(this,item)而不是相反
答案 1 :(得分:0)
我在compareTo
方法中看到了两个可能的困难:
if (this.totalSales != item.totalSales) {
return 0;
}
通常,如果两个对象相等,compareTo
方法应该返回0
。您经常会听到这样的短语“compareTo应该与equals()一致”,这意味着当equals()
返回true
时compareTo()
应返回0
,equals()
当false
返回compareTo()
以外的其他内容时,应返回0
。
作为一般规则,compareTo
如果-1
小于this
(您要比较的其他ItemSales),则应返回item
。如果'this'大于另一个compareTo
,则1
应返回item
。
第二个问题是看起来像潜在的无限循环:
return item.compareTo(this);
我喜欢你所评论的更好:
return Double.compare(item.totalSales, this.totalSales);
这就是我对比较方法的期望。
答案 2 :(得分:0)
将您的代码更改为
@Override
public int compareTo(ItemSales item) {
return Double.compare( this.totalSales ,item.totalSales);
}
根据您的if条件,您将按升序排除。所以在Double.compare中更改参数。正如其他人所说,请先阅读比较规范
myItems[0].getTotalSales() == 860.0