为什么Guavas Ordering没有正确排序整数的字符串值?

时间:2015-09-21 10:25:02

标签: string sorting guava

我想知道为什么Guavas Ordering在以下代码中无法正常工作:

public static void main(String[] args) {
    List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    System.out.println(Ordering.natural().isOrdered(integers));

    List<String> strings = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
    System.out.println(Ordering.natural().isOrdered(strings));

    List<String> strings2 = Arrays.asList("6417", "6418", "6419", "6420");
    System.out.println(Ordering.natural().isOrdered(strings2));
}

输出:

true
false
true

我希望看到true 3次。

有人可以解释为什么它没有按预期排序吗?

1 个答案:

答案 0 :(得分:10)

字符串的排序基于documentation中定义的词典排序,而不是数字排序。对于一对字符串,每个字符串的第一个字符被采用并进行比较。只有这些是相同的,才会看到第二个字符,依此类推。因此,字符串"10"比字符串"9"“更小”,因为字符'1'小于'9'

请注意,这是Java API的一部分,并非特定于Guava。您还可以查看"10".compareTo("9")的输出以查看此内容。 Guava的Ordering.natural()基本上只调用比较对象的compareTo方法。

原因是字符串是任意字符序列,并且不可能将它们全部解释为数字,因此数字比较通常会失败。其他编程语言以相同的方式处理它。