可比接口 - 如何比较int类型?

时间:2014-02-22 20:36:55

标签: java comparable

我有两个班级:

First implements Serializable {
    int month;
    int day;
    int hour;
    int minute;
}

Second implements Serializable, Comparable<?> {
    First object;
    int temperature;
}

我不得不将Second类的对象写入二进制文件。我知道他们需要实现Serializable接口这样做,我没有问题。问题是我必须创建一个这段代码的版本,这样就可以按照First类中保存的日期,按时间顺序将第二类的新对象添加到集合中。所以我需要比较整数(月,日,小时,分钟)。我知道我必须在Second类中声明方法CompareTo。如果我必须比较字符串,那就像(如果分钟是字符串):

public int compareTO(Second object) {
    return minute.compareTo(object.object.minute); 
}

已经完成了。但是我应该怎么处理这些整数呢? 我应该在“?”的位置写什么?在代码?

2 个答案:

答案 0 :(得分:2)

您的课程需要定义

class Second implements Serializable, Comparable<Second> {
      public int compareTo(Second other) {

在Java 7中,您可以使用

return Integer.compare(minute, object.minute);

或您可以执行多个字段

int cmp = Integer.compare(month, other.month);
if (cmp != 0) return cmp;
cmp = Integer.compare(days, other.days);
if (cmp != 0) return cmp;
cmp = Integer.compare(hours, other.hours);
if (cmp != 0) return cmp;
return Integer.compare(minutes, other.minutes);

对于早期的Java系统

return Double.compare(minute, object.minute);

或者

return minute > object.minute ? +1 : minute < object.minute ? -1 : 0;

在这种情况下,如果你知道你的整数范围小于20亿,即你不能得到溢出,你可以使用减法

return minute - object.minute; // if you know overflow is not possible.

答案 1 :(得分:1)

我假设这里的实际问题是关于如何处理多个 int值。您可以简单地进行词典比较:

public static int compareByTime(Second s0, Second s1)
{
    First f0 = s0.object;
    First f1 = s1.object;
    if (f0.month > f1.month) return 1;
    if (f0.month < f1.month) return -1;
    if (f0.day > f1.day) return 1;
    if (f0.day < f1.day) return -1;
    if (f0.hour > f1.hour) return 1;
    if (f0.hour < f1.hour) return -1;
    if (f0.minute > f1.minute) return 1;
    if (f0.minute < f1.minute) return -1;
    return 0;
}

一般情况下,我建议让类实现Comparable。如果类具有自然排序,则应该。对于你的Second课程,情况肯定不是这样。在大多数情况下,使用Comparator会更加灵活。但是,此方法既可用于实施Comparable,也可用于实施Comparator


编辑:在回应评论时稍微详细说明一下:

此方法用于两个Second对象的一般比较。您可以在Second类实现Comparable接口时使用它:

Second implements Serializable, Comparable<Second> 
{
    First object;
    int temperature;

    @Override
    public int compareTo(Second other)
    {
        return compareByTime(this, other); // The method from above 
    }
}

或者,您可以在为Comparator对象创建Second时使用它:

class SecondComparator implements Comparator<Second>
{
    @Override
    public int compare(Second s0, Second s1)
    {
        return compareByTime(s0, s1); // The method from above 
    }
}

在这两种情况下,您都可以将新对象插入到总是排序的TreeSet<Second>这样的集合中。或者,如果您使用List<Second>,则可以对二进制搜索插入对象的位置进行二进制搜索。 (或者只是将新对象添加到列表中,然后对列表进行排序,但这样效率会相当低)