2014-02-22 79 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