2010-09-14 65 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.