java - compareTo方法

时间:2014-12-06 04:33:09

标签: java sorting comparable compareto

我对java中的compareTo方法有疑问。所以这个compareTo方法比较CarOwner对象,如果调用对象在时间顺序上比参数返回-1更早,如果调用对象后来按时间顺序与参数相比返回1,如果调用对象和参数是如果传入的参数不是CarOwner对象(使用instanceof或getClass来确定),或者为null,则返回-1。

按时间顺序返回0。

我提出了这个代码,但它似乎没有工作,有人有任何建议吗?

public int compareTo(Object o)
{
    if ((o != null ) && (o instanceof CarOwner))
    {
        CarOwner otherOwner = (CarOwner) o;
        if (otherOwner.compareTo(getYear()) > 0)
            return -1;
        else if (otherOwner.compareTo(getYear()) < 0)
            return 1;
        else if (otherOwner.equals(getYear()))
            if (otherOwner.compareTo(getMonth()) > 0)
                return -1;
            else if (otherOwner.compareTo(getMonth()) < 0)
                return 1;
            else if (otherOwner.equals(getMonth()))
                return 0;
    }
    return -1;
}

5 个答案:

答案 0 :(得分:1)

您正在将此实例的属性与整个otherOwner实例进行比较。你应该与otherOwner的特性进行比较。

例如

otherOwner.getYear().compareTo(getYear())

答案 1 :(得分:0)

如果getYear()和getMonth()返回可比较的对象

,则应该有效
public int compareTo(Object o)
{
    if ((o != null ) && (o instanceof CarOwner))
    {
        CarOwner otherOwner = (CarOwner) o;
        int result = otherOwner.getYear().compareTo(getYear());
        if (result != 0)
            return result;
        return otherOwner.getMonth().compareTo(getMonth());
    }
    return -1;
}

如果getYear()和getMonth()返回int,则:

public int compareTo(Object o)
{
    if ((o != null ) && (o instanceof CarOwner))
    {
        CarOwner otherOwner = (CarOwner) o;
        if (otherOwner.getYear() > getYear())
            return -1
         else if (otherOwner.getYear() < getYear())
             return 1
         else if  (otherOwner.getMonth() > getMonth())
             return -1
         else if  (otherOwner.getMonth() < getMonth())
             return 1;
         else 
             return 0;
    }
    return -1;
}

答案 2 :(得分:0)

如果将该方法应用于某些CarOwner,会发生什么:

  1. 是的,它是CarOwner的一个实例。我们进入你的if块。
  2. 但是当你调用otherOwner.compareTo时,你传递的是“Year”或“Month”,我认为它是一个整数或字符串。
  3. 然后你去了otherOwner的compareTo方法,你的“Year”或“Month”不是CarOwner的一个实例,那么它总是返回-1。
  4. 所以你应该做的是将“Year”或“Month”与otherOwner的“Year”或“Month”进行比较并返回结果。

答案 3 :(得分:0)

当您比较不同的字段并深入挖掘年度字段是否相同时,我建议以下

int oy=otherOwner.getYear();
int ty=this.getYear();
int om=otherOwner.getMonth();
int tm=this.getMonth();

if(oy==ty){
    return om-tm;
}else{
    return oy-ty;
}

答案 4 :(得分:0)

在您的类(Comparable<CarOwner>)上实现可比较界面之后,使用CarOwner作为compareTo方法而不是Object(int compareTo(CarOwner otherOwner)