2010-09-14 60 views
10

我能夠比較字符串好,但想知道我如何可以排名浮點數?幫助比較使用比較器的浮點成員變量

getChange()返回一個字符串。我想能夠降序排序。我怎樣才能做到這一點?

UPDATE:

package org.stocktwits.helper; 

import java.util.Comparator; 

import org.stocktwits.model.Quote; 

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     float change1 = Float.valueOf(o1.getChange()); 
     float change2 = Float.valueOf(o2.getChange()); 

     if (change1 < change2) return -1; 
     if (change1 == change2) return 0; // Fails on NaN however, not sure what you want 
     if (change2 > change2) return 1; 
    } 
} 

我收到編譯時錯誤:

This method must return a result of type int ChangeComparator.java 
+0

除了NaN的問題,你必須在你的代碼沒有保證return語句。實際上你是這樣做的,但是編譯器不能說出來,因爲你有三個不同的if語句。它不能直到運行時才評估它,所以它認爲你實際上可以通過最後一條if語句並且沒有返回子句。 – Matt 2012-07-24 19:04:21

回答

12

閱讀Comparator#compare()方法的javadoc。

Compares its two arguments for order. Returns a negative integer, zero or a positive integer as the first argument is less than, equal to or greater than the second.

所以,基本上

float change1 = o1.getChange(); 
float change2 = o2.getChange(); 
if (change1 < change2) return -1; 
if (change1 > change2) return 1; 
return 0; 

或者,如果你喜歡有條件的經營者:

return o1.getChange() < o2.getChange() ? -1 
    : o1.getChange() > o2.getChange() ? 1 
    : 0; 

但是,您需要承擔與Float.NaN帳戶。我不確定你想如何讓他們訂購。第一?持續?一樣?

+0

小心Float.NaN!我假設你的數據沒有NaN,但是因爲NaN在任何比較的一側總會返回false(甚至是Float。NaN == Float.NaN爲false!),你可能需要一個Float.isNaN(change1)或其他檢查。否則,如果涉及NaN,分類將顯然是隨機的。 – 2010-09-14 00:10:12

+0

我收到編譯時錯誤(請參閱我的問題中更新的代碼):此方法必須返回int \t ChangeComparator.java – 2010-09-14 00:16:11

+0

編譯錯誤本身。你需要確保它總是**返回一個'int'。我將編輯示例。 – BalusC 2010-09-14 00:17:13

13

如何:

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     Float change1 = Float.valueOf(o1.getChange()); 
     Float change2 = Float.valueOf(o2.getChange()); 
     return change1.compareTo(change2); 
    } 
} 

注意,Java 1.4中引入的Float#compare(float, float)(和Double等效),它可以直接被相當多用:

public class ChangeComparator implements Comparator<Quote> 
{ 
    public int compare(Quote o1, Quote o2) { 
     return Float.compare(o1.getChange(), o2.getChange()); 
    } 
} 

(編輯完成後,我注意到那@BorislavGizdov已經在他的回答中提到了這一點。)


另外值得注意的是,Java 8 Comparator#comparing(...)Comparator#comparingDouble(...)提供了直接構建這些比較器的直接方式。

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange); 

將比較使用盒裝Float值。

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange); 

會比較用晉升爲doublefloat值。

鑑於沒有Comparator#comparingFloat(...),我傾向於使用comparingDouble(...)方法,因爲這隻涉及基元類型轉換,而不是裝箱。

+4

這是最好的答案 - 將比較委託給Float的compareTo。 – 2010-09-14 00:39:40

8

您可以使用Float.compare(float f1, float f2)

public static int compare(float f1, float f2) 

Compares the two specified float values. Returns the value 0 if f1 is numerically equal to f2; a value less than 0 if f1 is numerically less than f2; and a value greater than 0 if f1 is numerically greater than f2.