2013-05-27 70 views
-3

我簡單的例子(編譯後的工作代碼)只是不會根據它們的權重對水果進行排序。爲什麼我的對象沒有實現Comparable排序?

import java.util.Arrays; 

public class Test { 

    public static class Fruit implements Comparable<Fruit> { 
     public int weight = 0; 
     public Fruit(int w) { weight = w; } 
     // compare this fruit to a given fruit f 
     public int compareTo(Fruit f) { 
      return (weight > f.weight) ? 1 : 0; 
     } 
    } 

    public static void main(String[] args) { 

     // get some fruits (we intentionally create a box for 100 fruits) 
     Fruit[] fruits = new Fruit[100]; 
     for (int i = 0; i < 10; i++) { 
      fruits[i] = new Fruit((int)(Math.random() * 50 + 1)); 
     } 

     // sort fruits by weight 
     Arrays.sort(fruits, 0, 10); 

     // print fruit weights 
     for (int i = 0; i < 10; i++) { 
      System.out.print(fruits[i].weight + " "); 
     } 

    } 

} 

爲什麼是這樣?

好吧,在我的問題(不是關於水果)中,我有永遠不會成對平等的物體,這就是爲什麼我認爲一個物體比另一個物體大或小的原因。那麼當我知道0(對象相等)永遠不會發生時,我該如何處理這種情況呢?

+1

如果您正確實現了compareTo操作(請參閱下面的答案),並且根據定義,兩個值永遠不會相等,compareTo將永遠不會返回0 - 無需專門處理不會發生的事情。如果 - 由於某些原因 - 它會在一段時間後發生,你的假設是錯誤的,但是實現仍然是正確的(如果compareTo則返回0)。沒有傷害,對吧? –

回答

3

如果weight從不爲負,那麼你可以嘗試的

return weight - f.weight; 

代替

return (weight > f.weight) ? 1 : 0; 

從最低排序,最高值。

+0

我喜歡你的解決方案,因爲'return weight -f.weight'比Integer的'return(weight

+0

@SophieSperner如果水果的重量始終是'> = 0'且所有重量都不相同,那麼'weight-f.weight'永遠不會返回0.但在您的示例中,水果可以具有相同的重量,所以我不太確定如何回答你的評論。 – Pshemo

+0

當預計所有數字都是正數和/或小數時,效果很好。但是'-3 - Integer.MAX_VALUE'會錯誤地返回一個正數。 – assylias

0

compareTo方法應該返回-1,0,1

LESSER = -1; 
EQUAL = 0; 
BIGGER = 1; 
7

compareTo必須返回3個值中的一個:

  • >0 - >大於

  • 0 - - >等於

  • <0 - >小於

compareTo方法只返回01;解決該問題。

+0

比什麼大?我完全錯過了。 –

+2

+1任何正數或負數準確.. – Anirudha

+0

1 - >該對象更大(或之後,如果您想要拼寫)作爲參數傳遞的。 – SJuan76

4

使用類java.lang.Integer(自Java 7以來)的方法public static int compare(int x, int y)

public int compareTo(Fruit f) { 
    return Integer.compare(weight, f.weight); 
} 
+1

+1使用庫! – assylias

2

最好的方法是使用JDK提供的方法比較int值,這也使得它晶瑩剔透什麼代碼做

public int compareTo(Fruit f) { 
    return Integer.compare(weight, f.weight); 
} 

此前版本7的Java,你有兩個選擇:

public int compareTo(Fruit f) { 
    return weight - f.weight; // terse, but slightly obtuse 
} 

public int compareTo(Fruit f) { 
    return new Integer(weight).compareTo(f.weight); // ugly, but supposedly clear 
} 

我的偏好是減法,因爲一旦你理解了它,從此就清楚了。

+0

沒有'Integer.compare'不是最好的,因爲嵌套調用比較是廢話,尤其是比較整數。 –

+0

@SophieSperner說你... java會通過JIT將它內聯到減法中。這是最清晰的代碼,這很重要。 – Bohemian

+0

'weight-f.weight'更清晰。 –

相關問題