2014-08-28 129 views
0

我知道這些方法的返回值的規則是obj1.compareTo(obj2)的規則,例如,如果obj2在層次結構中的obj1下,則返回值爲,如果它在obj1的頂部,那麼它的正面(如果它相等,那麼它是0)。然而,在我的課堂上,我看到了使用Math.signum的例子,以便在compareTo方法中獲得-1(用於負數)和1(用於正數)。比較和比較的負值和正值返回值

有什麼理由呢?


編輯:

這裏是我的意思代碼:

Comparator comp = new Comparator() { 
    public int compare(Object obj1, Object obj2) { 
     Book book1 = (Book) obj1; 
     Book book2 = (Book) obj2; 

     int order = book1.getAuthor().compareTo(book2.getAuthor()); 
     if (order == 0) { 
      order = (int) Math.signum(book1.getPrice() - book2.getPrice()); 
     } 
    return order; 
}; 
+0

也許pedantry? – biziclop 2014-08-28 19:57:54

+0

對不起,我在 – Goldi 2014-08-28 20:03:47

+2

之後加了它可能價格有浮動或雙重類型。如果是這樣,那幾乎是正確的實施。因爲如果你只是寫'(int)book1.getPrice() - book2.getPrice()',你可能會溢出。幾乎是因爲浮點類型的平等是可能的。 – talex 2014-08-28 20:07:36

回答

2

沒有任何理由使用Math.signum

存在。

order = (int) Math.signum(book1.getPrice() - book2.getPrice()); 

假設你有更換此

order = (int)(book1.getPrice() - book2.getPrice()); 

現在上面的線,讓我們假設

book1.getPrice() returns 10.50 
book2.getPrice() returns 10.40 

如果不使用正負號你將永遠不會有任何編譯或運行時錯誤,但訂單的值將爲0.這意味着book1等於book2,其中i這在邏輯上是錯誤的。

但是,如果您使用signumorder將是1,這意味着book1> book2。

但必須提到的是,您絕不應該對比較函數在1和-1之間返回值做任何假設。 您可以閱讀比較器http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html的官方文檔。

1

任何負數會做表明,<灣而任何正數都表明a> b。 -1和1可以達到目的。沒有什麼比「更少」或「更多」的意義;他們是二元屬性。允許任何負面(或正面)價值的原因可能是歷史的;對於整數,通過簡單的減法來實現比較器是很常見的。

0

我能看到的唯一理由是,如果你想例如(ab)比較兩個int s,而你寫

return a - b; 

它可能溢出。如果您將它們轉換爲雙打併使用(int)Math.signum((double)a - (double)b),那麼您肯定會避免這種情況。但是有一些簡單的方法可以達到同樣的效果,例如Integer.compare(a, b)

1

PS:實施頻繁的錯誤就是用減法

public int compareTo(Object o) { 
    OurClass other = (OurClass)o; //Skip type check 

    return this.intField - other.intField; 
} 

,因爲如果你打電話new OurClass(Integer.MIN_VALUE).compareTo(new OurClass(Integer.MAX_VALUE))你得到溢出這是錯誤的。可能Math.abs是嘗試(失敗)來處理這個問題。