我可以很好地比较字符串,但想知道我如何对浮点数进行排名?
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;
}
}
我收到编译时错误:
This method must return a result of type int ChangeComparator.java
答案 0 :(得分:15)
阅读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
。我不确定你是怎么想订购它们的。第一?持续?同样?
答案 1 :(得分:15)
这个怎么样:
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);
将使用提升为float
值的double
值进行比较。
鉴于没有Comparator#comparingFloat(...)
,我的偏好是使用comparingDouble(...)
方法,因为这只涉及原始类型转换,而不是装箱。
答案 2 :(得分:8)
您可以使用Float.compare(float f1, float f2)
:
public static int compare(float f1, float f2)
比较两个指定的浮点值。如果f1在数值上等于f2,则返回值0;如果f1在数值上小于f2,则小于0的值;如果f1在数值上大于f2,则值大于0.
答案 3 :(得分:0)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner input = new Scanner(System.in);
int tc = input.nextInt();
int alpha = 0;
while (tc-- > 0) {
int ttc = input.nextInt();
int sort = input.nextInt();
input.nextLine();
Vector<student> v = new Vector<>();
alpha++;
while (ttc-- > 0) {
String name = input.next();
int weit = input.nextInt();
int age = input.nextInt();
float hight = input.nextFloat();
v.add(new student(name, weit, age, hight));
}
Collections.sort(v);
int count = 0;
System.out.println("CENARIO {" + alpha + "}");
for (student s : v) {
System.out.print((count + 1) + " - ");
System.out.println(s.name);
count++;
if (count == sort) {
break;
}
}
}
}
private static class student implements Comparable<student> {
String name;
int weit;
int age;
float hight;
public student(String name, int weit, int age, float hight) {
this.name = name;
this.weit = weit;
this.age = age;
this.hight = hight;
}
@Override
public int compareTo(student t) {
if (this.weit - t.weit != 0) {
return t.weit - this.weit;
}
if (this.age - t.age != 0) {
return this.age - t.age;
}
if (this.hight - t.hight != 0) {
return Float.compare(this.hight, t.hight);
}
return this.name.compareTo(t.name);
}
}
}