2010-06-21 22 views
3

我想根據布爾值對對象進行排序,我想在錯誤值之前對真值進行排序。compareTo方法的哪種用法更容易理解?

compareTo的以下哪些實現更具可讀性?

使用-1來改變默認的行爲布爾#compareTo方法的

public class Example implements Comparable<Example>{ 

    Boolean isOk; 

    public int compareTo(Example o) { 
     return -1 * this.isOk.compareTo(o.isOk); 
    } 

} 

或交換了立場?

public class ExampleTwo implements Comparable<ExampleTwo>{ 

    Boolean isOk; 

    public int compareTo(ExampleTwo o) { 
     return o.isOk.compareTo(this.isOk); 
    } 

} 
+3

使用'-1 *'引入了一個微妙如果由於Integer.MIN_VALUE * -1 == Integer.MIN_VALUE','compareTo()'方法返回'Integer.MIN_VALUE',將會出錯。出於這個原因,我不會寫一個'compareTo()'方法來返回這樣的極值,但它絕對符合規範,所以你必須能夠處理它。 – 2010-06-21 11:18:20

+0

@Joachim:我只是在我的回答中寫同樣的東西:) – 2010-06-21 11:20:33

回答

4

第一種形式是簡單地錯誤 - 因爲如果compareTo回報Integer.MIN_VALUE,它會嘗試否定這一點 - 再次導致Integer.MIN_VALUE

解決這個問題的最簡單方法就是使用第二個代碼片段中的代碼。

在另一方面:

  • 如果isOk爲null
  • 如果你真的只使用布爾雙方可能會失敗,一個簡單的事實表可以更簡單
  • 這是可能Boolean.compareTo永遠不會返回Integer.MIN_VALUE。我不會依賴那個。
+0

我同意答案,但想指出#2也可能失敗,如果o爲空,並且(雖然我同意#1不是理想的)通過調用Math.signum可以修復Integer.MIN_VALUE問題。 – 2010-06-21 12:12:26

3

我會用Ordering classGuava(以前Google Collections),它實現Comparator,因此它可以作爲一個下拉更換:

Ordering<Object> reverseOrdering = Ordering.natural().reverse(); 
+1

+1 - 如有疑問,請諮詢番石榴:) – 2010-06-21 11:43:13