我想知道为什么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次。
有人可以解释为什么它没有按预期排序吗?
答案 0 :(得分:10)
字符串的排序基于documentation中定义的词典排序,而不是数字排序。对于一对字符串,每个字符串的第一个字符被采用并进行比较。只有这些是相同的,才会看到第二个字符,依此类推。因此,字符串"10"
比字符串"9"
“更小”,因为字符'1'
小于'9'
。
请注意,这是Java API的一部分,并非特定于Guava。您还可以查看"10".compareTo("9")
的输出以查看此内容。 Guava的Ordering.natural()
基本上只调用比较对象的compareTo
方法。
原因是字符串是任意字符序列,并且不可能将它们全部解释为数字,因此数字比较通常会失败。其他编程语言以相同的方式处理它。