java将整数作为字符串与比较器进行比较 - 奇怪的结果

时间:2012-05-02 17:33:52

标签: java int comparator dereference

我正在尝试用一些比较器比较他们获得的跑步数量。

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

3 个答案:

答案 0 :(得分:3)

我认为intConvert(...)会将int转换为String,因此您会获得词汇比较,其中"25"大于"100",因为第一个字符更大(2> 1)。

如果你想得到正确的比较,坚持比较int或者如果你需要使用String创建相等长度的字符串并在前面填充缺失零(例如{{1} }。

答案 1 :(得分:0)

要以合理的方式比较Numbers代表String,您需要以相同的方式一致地格式化它们。

Strings 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,文档说:

  

返回:

     

负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。