【问题标题】:java comparing integers as strings with a comparator - odd resultsjava将整数作为字符串与比较器进行比较-奇怪的结果
【发布时间】:2012-05-12 05:27:11
【问题描述】:

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

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

【问题讨论】:

  • 请注意,compareTo 不必返回 -1 或 1,它也可以返回更小或更大的值。基本上约定是: 0 表示较大。

标签: java int comparator dereference


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    "05" 是 < "20"

    最简单的方法是使用String.format() 和一个模式将所有数字格式化为Strings,这样它们就可以在词法上保持一致。

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

    这将生成所有传入的ints,左侧填充有0 4 个位置。

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

    将产生0005

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

    【讨论】:

    • X 可以是变量吗?
    【解决方案3】:

    您不必为了排序而将数字转换为字符串,您可以执行以下操作:

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

    返回:

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

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 2011-09-13
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多