Java 区分大小写的字符串排序是否损坏?
Is Java case-sensitive string sorting broken?
我尝试对 Java 中的一些字符串进行区分大小写的排序,我对结果感到非常惊讶。这是代码:
List<String> words = List.of("aLocalized", "aaLocalized", "aaaLocalized", "ALocalized", "AALocalized", "AAALocalized");
System.out.println(words.stream().sorted().collect(Collectors.joining(" ")));
结果如下:
AAALocalized AALocalized ALocalized aLocalized aaLocalized aaaLocalized
对我来说这看起来不对。为什么小写字母 a
出现在 aa
之前,而 aa
出现在 aaa
之前,而大写字母 AAA
出现在 AA
和 [=17 之前=] 出现在 A
?
之前
您可能没有意识到,所有大写字母都在小写字母之前。所以 List.of("A", "a", "B", "b", "C", "c");
会导致 A B C a b c
它们按每个字符的数字代码点排序。
字符串中的每个字符都有一个数字代码点,由 Unicode 规范指定。 Unicode 的前 128 个代码点的排序称为 ASCII。正如您在 table 中看到的那样,大写字母的代码点编号低于小写字符,因此在排序时大写字母始终排在小写字母之前。
例如,A
是代码点 41(十六进制),而 a
是 61。因此 A
出现在 a
之前。
如果您希望字符串按字典顺序排序,请使用 Collator:
System.out.println(
words.stream().sorted(Collator.getInstance())
.collect(Collectors.joining(" ")));
我尝试对 Java 中的一些字符串进行区分大小写的排序,我对结果感到非常惊讶。这是代码:
List<String> words = List.of("aLocalized", "aaLocalized", "aaaLocalized", "ALocalized", "AALocalized", "AAALocalized");
System.out.println(words.stream().sorted().collect(Collectors.joining(" ")));
结果如下: AAALocalized AALocalized ALocalized aLocalized aaLocalized aaaLocalized
对我来说这看起来不对。为什么小写字母 a
出现在 aa
之前,而 aa
出现在 aaa
之前,而大写字母 AAA
出现在 AA
和 [=17 之前=] 出现在 A
?
您可能没有意识到,所有大写字母都在小写字母之前。所以 List.of("A", "a", "B", "b", "C", "c");
会导致 A B C a b c
它们按每个字符的数字代码点排序。
字符串中的每个字符都有一个数字代码点,由 Unicode 规范指定。 Unicode 的前 128 个代码点的排序称为 ASCII。正如您在 table 中看到的那样,大写字母的代码点编号低于小写字符,因此在排序时大写字母始终排在小写字母之前。
例如,A
是代码点 41(十六进制),而 a
是 61。因此 A
出现在 a
之前。
如果您希望字符串按字典顺序排序,请使用 Collator:
System.out.println(
words.stream().sorted(Collator.getInstance())
.collect(Collectors.joining(" ")));