使用Comparators帮助比较float成员变量

She*_*lam 11 java sorting arraylist comparable comparator

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

getChange()返回一个String.我希望能够降序排序.我怎样才能做到这一点?

更新:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到编译时错误:

This method must return a result of type int    ChangeComparator.java   
Run Code Online (Sandbox Code Playgroud)

msa*_*ord 16

这个怎么样:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,引入了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());
    }
}
Run Code Online (Sandbox Code Playgroud)

(编辑后,我注意到@BorislavGizdov已经在他的回答中提到了这一点.)


另外值得注意的是Java 8 Comparator#comparing(...)Comparator#comparingDouble(...)提供了直接构建这些比较器的简单方法.

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange);
Run Code Online (Sandbox Code Playgroud)

将使用盒装Float值进行比较.

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange);
Run Code Online (Sandbox Code Playgroud)

将使用float提升为double值的值进行比较.

鉴于没有Comparator#comparingFloat(...),我的偏好是使用该comparingDouble(...)方法,因为这只涉及原始类型转换,而不是装箱.

  • 这是最好的答案 - 将比较委托给Float的compareTo. (4认同)

Bal*_*usC 15

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

比较它的两个参数的顺序.当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数.

所以,基本上:

float change1 = o1.getChange();
float change2 = o2.getChange();
if (change1 < change2) return -1;
if (change1 > change2) return 1;
return 0;
Run Code Online (Sandbox Code Playgroud)

或者如果您喜欢条件运算符:

return o1.getChange() < o2.getChange() ? -1 
     : o1.getChange() > o2.getChange() ? 1 
     : 0;
Run Code Online (Sandbox Code Playgroud)

但是你需要考虑到Float.NaN.我不确定你是怎么想订购它们的.第一?持续?相等?


Bor*_*dov 8

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

  public static int compare(float f1, float f2)
Run Code Online (Sandbox Code Playgroud)

比较两个指定的浮点值.如果f1在数值上等于f2,则返回值0; 如果f1在数值上小于f2,则小于0的值; 如果f1在数值上大于f2,则值大于0.