2012-06-17 52 views
0

我遇到了一個compareTo方法的問題。該程序模擬不同的員工類型,並且我按照員工類型進行了完美排序,但無法按總薪酬進行二次排序。一旦按照類名稱/員工類型排序,它就需要按照grossPay進行排序,我可以通過輔助方法獲取這些數據。以下是代碼:CompareTo Overide Sort

public int compareTo(Object o) { 

    Employee other = (Employee) o; 

    if(other instanceof Salaried) 
     return -1; 

    else if(other instanceof Daily) 
     return 1; 

    else 
     return 0; 
} 

我正在使用Collectionssort()與employess的arraylist。當我打印出來的時候,我根據員工類型得到了一個很好的排序清單,但是應該按照grossPay排序。

+0

你可能想看看[http://stackoverflow.com/questions/369512/best-way-to-compare-objects-by-multiple-fields](http://stackoverflow.com/questions/369512 /最好的路到比較對象按多字段)。它(據我瞭解)幾乎可以回答你的問題。 – purtip31

回答

3

您可以比較類型比較後的grossPay。假設grossPay是一個數字。

public int compareTo(Object o) { 

    Employee other = (Employee) o; 
    if(this instanceof Daily && other instanceof Salaried) 
     return -1; 

    else if(this instanceof Salaried && other instanceof Daily) 
     return 1; 

    else 
     return this.getGrossPay() - other.getGrossPay(); 
} 
+2

關閉,但由於溢出的可能性,您不應該使用整數減法來實現'compareTo'。如果'getGrossPay()'已經返回了一個'Integer'值,那麼你可以使用Integer.compareTo,但是對於原語,堅持'<' and '>'。在Java 7中,有一個靜態方法'Integer.compare(int,int)'。 –

+0

不幸的是,這並不確定。如果'這是薪水,另一個是薪水,這將返回'-1'。如果交換兩個操作數,它將再次返回'-1'。所以比較與總訂單不一致。這種排序可能會產生錯誤的答案或永不終止。 – Gene

+0

@Gene我編輯了我的答案。 – plucury

6

compareTo必須返回的結果總順序一致。否則,排序結果不能以任何方式保證。總訂單意味着如果A<B,那麼B>AA==B,然後B==A。換句話說,您可以切換thisother,結果是一致的。即使對於員工類型,您所提供的代碼也不會這樣做。

如果compareTo與總訂單不一致,sort可能會產生錯誤答案或永不終止。

目前還不清楚您的系統是否有3種類型的員工或2.我們假設這是2:薪水和每日。然後,我們需要通過possiblities工作:

this  other result 
------------------------ 
salaried salaried equal 
daily salaried < 
salaried daily > 
daily daily equal 

只有當我們已經建立,這和其他的員工類型等於做我們把次要排序鍵,這是工資總額。

因此,要編寫一個方法是:

// Assume this and o have type Daily or Salaried. 
public int compareTo(Object o) { 
    if (this instanceof Daily && o instanceof Salaried) return -1; 
    if (this instanceof Salaried && o instanceof Daily) return +1; 
    // The employee types must be equal, so make decision on pay. 
    Employee e = (Employee)o; 
    return grossPay() < e.grossPay() ? -1 : 
     grossPay() > e.grossPay() ? +1 : 0; 
} 

我假設這是Employee實現。

最後,用Comparator實現這種類型可能會更好。 compareTo方法應保留爲「自然」排序順序,例如充當主鍵的唯一標識號的數字順序。這種排序標準似乎並不「自然」。

+0

「比較器」的+1。 – Genzer