Java覆盖Arrays.sort()的compareTo方法

时间:2014-05-01 19:23:31

标签: java object comparable

我试图覆盖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应该是相同的"错误

3 个答案:

答案 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()返回truecompareTo()应返回0equals()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