2014-02-22 39 views
0

我有两个类:可比较的接口 - 如何比较int类型?

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

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

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

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

并且完成了。但我应该如何处理这些整数? 我应该在什么地方写“?”在代码中?

+0

?应该用int替换,因为你试图比较整数 –

+0

你的?应该是这样的第二个:'Second implements Serializable,Comparable ' – Durandal

+0

你是对的MagicMan。谢谢:) – RIPI

回答

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 
    } 
} 

或者当你创建一个ComparatorSecond对象,你可以使用它:

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>,则可以对二进制搜索插入对象的位置进行二进制搜索。 (或者简单地将新对象添加到列表中,然后对列表进行排序,但这会效率不高)

+0

我明白你的观点......但是!我不知道我是否正确理解此代码,但它如何处理多个对象的比较问题?现在我可以将一个对象与另一个对象进行比较,并说出哪个对象更早...但是如果我已经有10个对象并且我愿意添加第11个对象?我怎么说,在哪里放? – RIPI

+0

@RIPI您可以使用Collections.sort()对一个集合中的多个对象进行排序; –

+0

@RIPI您可以将它们添加到TreeSet等有序集合中。 –

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; 

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

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

+ +1用于直接减法的溢出风险 – Bohemian

+0

oooh呀!当然它的作品:)非常感谢你! – RIPI