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

naz*_*art 0 sorting string 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));
}
Run Code Online (Sandbox Code Playgroud)

输出:

true
false
true
Run Code Online (Sandbox Code Playgroud)

我预计会看到true3次.

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

Phi*_*ler 10

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

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

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