使用比较器帮助比较浮点成员变量

我可以很好地比较字符串,但想知道如何对浮点数进行排名?

getChange() 返回一个字符串。我希望能够按降序排序。我该怎么做?

更新:

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   

答案 1

怎么样:

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);

将使用提升为值的值进行比较。floatdouble

鉴于没有,我倾向于使用该方法,因为这只涉及基元类型转换,而不是装箱。Comparator#comparingFloat(...)comparingDouble(...)


答案 2

阅读 Comparator#compare() 方法的 javadoc。

比较其两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。

所以,基本上

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。我不确定您希望如何订购它们。第一?最后?同样?


推荐