Java比较接口compareTo(Object o),什么是对象o?

时间:2013-07-16 23:45:23

标签: java interface comparable

初学者,似乎无法绕过这个。

项目类

public class Item implements Comparable {

private int number;
private String description;

public Item(int num, String descript){
    this.number = num;
    this.description = descript;
}

public int getNumber(){
    return number;
}

public String getDescription(){
    return description;
}

@Override public int compareTo(Object o){
    Item i = (Item) o;
    if(this.getNumber() < i.getNumber())
        return -1;

    if(this.getNumber() > i.getNumber())
        return 1;

    return 0;
}

}

主要方法

Item[] items = new Item[3];
    items[0] = new Item(102, "Duct Tape");
    items[1] = new Item(103, "Bailing wire");
    items[2] = new Item(101, "Chewing Gum");

    Arrays.sort(items);

    for (Item i : items){
        System.out.println(i.getNumber() + ": " + i.getDescription());
    }

当main方法实例化items[0] = new Item(102, "Duct Tape");时,通过Item构造函数设置当前变量号,描述。

我的问题是我似乎无法理解compareTo参数中传递的内容,因此我似乎无法理解this.getNumber() < i.getNumber()正在做...

如果当前对象小于传递对象,则返回负数?

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

您正在使用的原始界面Comparable允许此对象与另一个Object相媲美。然后将其转换为Item,以确保this Item仅与另一个Item进行比较。

根据Comparable Javadocs

  

将此对象与指定的订单对象进行比较。返回一个   负整数,零或正整数,因为此对象较少   比,等于或大于指定的对象。

此外,如果compareTo不是ClassCastException,您的Object会在运行时抛出Item

使用界面的通用形式更好:

public class Item implements Comparable<Item> {

然后,您可以指定Item代替Object进行比较:

@Override public int compareTo(Item i){

并且您不必将Object投射到Item。调用compareTo时,编译器会强制要比较的对象必须是Item

答案 1 :(得分:1)

  

我的问题是我似乎无法理解compareTo参数

中传递的内容

Array.sort使用compareTo方法知道如何比较数组中的项目对。

您的排序方法假定只会使用Item的实例调用它,并且所有Array.sort都会传递给compareTo,假设您的数组只保存{{1}的实例}}

如果调用Item且被比较的项目不是compareTo的实例,则会收到运行时异常。

  

我似乎无法理解Item正在做...

它正在根据this.getNumber() < i.getNumber()的值比较Item的两个实例,即getNumber字段的值。它假定number的两个实例相等,如果Item对于每个实例都相同,否则如果Item.number小于另一个Item.number,则其中一个小于另一个实例

答案 2 :(得分:0)

您正在尝试覆盖默认的compareTo()方法,该方法将单个Object作为参数。因此,在您的实现中,参数必须是Object类型。但是,您假设您将传入Item对象,因此您可以相应地投射它。

最后,您的Item对象被视为Object,并在Item方法中投放回compareTo()

答案 3 :(得分:0)

传递给compareTo方法的Object是一个Item对象。当你实现它时,Arrays.sort()调用Overrided方法,最好的实现是返回原始java类型的compareTo方法

 @Override 
 public int compareTo(Object o){
      return (this.getNumber().compareTo((Item)o.getNumber());
 }

(这要求您将数字设为Integer类型)