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(...)
方法,因为这只涉及原始类型转换,而不是装箱.
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
.我不确定你是怎么想订购它们的.第一?持续?相等?
你可以使用Float.compare(float f1, float f2)
:
Run Code Online (Sandbox Code Playgroud)public static int compare(float f1, float f2)
比较两个指定的浮点值.如果f1在数值上等于f2,则返回值0; 如果f1在数值上小于f2,则小于0的值; 如果f1在数值上大于f2,则值大于0.
归档时间: |
|
查看次数: |
17044 次 |
最近记录: |