0

我正在尝试将一些玩家与比较器通过他们获得的跑量进行比较。

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 吗?

转换:

     private static String intConvert(int x)
     {
      return "" + x;
     }
4

3 回答 3

3

我假设intConvert(...)将 an 转换int为 a String,因此您会得到 meahs"25"大于的词法比较,"100"因为第一个字符更大(2 > 1)。

如果您想获得正确的比较,请坚持比较ints 或者如果您需要使用String创建相等长度的字符串并在前面填充缺失的零(例如25 -> "025").

于 2012-05-02T17:40:12.450 回答
0

要以合理的方式比较Numbers它们String,您需要以相同的方式始终如一地格式化它们。

Strings 使用词法比较。这意味着"5"将是> "20"因为5is >than 2。要获得逻辑上预期的输出,您需要使用某种格式化程序对数字进行格式化,以使它们在词法上具有可比性。

"05"< "20"

最简单的方法是使用String.format()一个模式来格式化所有数字,Strings以便它们在词法上进行一致的比较。

String.format("%04d", yourInteger);

这将生成所有int传入的 s,左侧填充04 个位置。

String.format("%04d", 5);

会产生0005

使"%0Xd"whereX是您希望将其格式化为的位数。

于 2012-05-02T17:42:45.260 回答
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,文档说:

回报:

作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数。

于 2012-05-02T17:47:35.447 回答