我正在尝试用一些比较器比较他们获得的跑步数量。
System.out.println("Comparing: " + p2.getRuns() + " and " + p1.getRuns());
int newRESULT = intConvert(p2.getRuns()).compareTo(intConvert(p1.getRuns()));
System.out.println("Returns: " + newRESULT);
return newRESULT;
但是这会返回:
比较:25和0, 返回:2
比较:0和100, 返回:-1
比较:25和100, 返回:1
...因此以错误的顺序命令玩家。
如果第一次比较不返回1,那么第二次-1和最后一次-1也是如此?
intConvert:
private static String intConvert(int x)
{
return "" + x;
}
答案 0 :(得分:3)
我认为intConvert(...)
会将int
转换为String
,因此您会获得词汇比较,其中"25"
大于"100"
,因为第一个字符更大(2> 1)。
如果你想得到正确的比较,坚持比较int
或者如果你需要使用String
创建相等长度的字符串并在前面填充缺失零(例如{{1} }。
答案 1 :(得分:0)
要以合理的方式比较Numbers
代表String
,您需要以相同的方式一致地格式化它们。
String
s use lexical comparisons.这意味着"5"
将是>
"20"
,因为5
是>
而不是2
。要获得逻辑上预期的输出,您需要使用某种格式化器来格式化数字,以使它们在词汇上具有可比性。
"05"
是<
"20"
最简单的方法是使用String.format()
和模式将所有数字格式化为Strings
,以便它们在词汇上进行一致的比较。
String.format("%04d", yourInteger);
这将生成所有传递给int
的{{1}}用0
填充4个位置。
String.format("%04d", 5);
将生成0005
将"%0Xd"
设为X
是您希望其格式化为的位数。
答案 2 :(得分:0)
您不必将数字转换为字符串只是为了排序,您可以执行以下操作:
class ComparePlayersByRuns implements Comparator<Player> {
public int compareTo(Player p1, Player p2) {
return p1.getRuns().compareTo(p2.getRuns());
}
}
或者在Java 8及更高版本中,您只需要创建比较器:
Comparators.comparing(Player::getRuns);
不,比较不需要返回1,0或-1,文档说:
返回:
负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。