为什么 Guavas Ordering 不能正确排序整数的字符串值?
Why Guavas Ordering doesn't sort string values of integers correctly?
我想知道为什么 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 次。
有人可以解释为什么它没有按预期排序吗?
字符串的排序基于 documentation 中定义的字典顺序,而不是数字排序。对于一对字符串,获取并比较每个字符串的第一个字符。只有当它们相等时,才会查看第二个字符,依此类推。因此字符串 "10"
比字符串 "9"
是 "smaller",因为字符 '1'
小于 '9'
.
请注意,这是 Java API 的一部分,并不特定于 Guava。您还可以查看 "10".compareTo("9")
的输出以了解这一点。 Guava的Ordering.natural()
基本上就是调用比较对象的compareTo
方法。
这是因为字符串是任意的字符序列,不可能全部解释为数字,因此数字比较经常会失败。其他编程语言以相同的方式处理此问题。
我想知道为什么 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 次。
有人可以解释为什么它没有按预期排序吗?
字符串的排序基于 documentation 中定义的字典顺序,而不是数字排序。对于一对字符串,获取并比较每个字符串的第一个字符。只有当它们相等时,才会查看第二个字符,依此类推。因此字符串 "10"
比字符串 "9"
是 "smaller",因为字符 '1'
小于 '9'
.
请注意,这是 Java API 的一部分,并不特定于 Guava。您还可以查看 "10".compareTo("9")
的输出以了解这一点。 Guava的Ordering.natural()
基本上就是调用比较对象的compareTo
方法。
这是因为字符串是任意的字符序列,不可能全部解释为数字,因此数字比较经常会失败。其他编程语言以相同的方式处理此问题。