我正在尝试使用Locale.SIMPLIFIED_CHINESE按国家名称排序,但它似乎是使用拼音(即根据字符的拉丁字母组合进行排序,从A到Z)。
但我发现有些情况下排序不正确。例如:
- '中' 字符应为 zhong1
- '梵' 字符应为 fan4
正确的顺序应该是 梵 < 中 ,但实际上排序方式相反。
String[] characters = new String[] {"梵", "中"};
List<String> list = Arrays.asList(characters);
System.out.println("Before sorting...");
System.out.println(list.toString());
Collator collator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE);
collator.setStrength(Collator.PRIMARY);
Collections.sort(list, collator);
System.out.println("After sorting...");
System.out.println(list.toString());
这段代码的结果是:
Before sorting...
[梵, 中]
After sorting...
[中, 梵]
深入了解后,我发现Java在Locale.SIMPLIFIED_CHINESE下应用的排序规则。您可以在以下图像中找到:
https://postimg.cc/image/4t915a7gp/full/(请注意,梵字在中文之后)。我注意到,在我用红色标出的<口<口<口<口<口之前,所有字符都按照它们的拉丁字母对应组合顺序排列,从A到Z。然而,在<口<口<口<口<口符号之后,字符按其组成进行排序。例如,如果所有字符具有相同的部分(通常是字符的左部),则它们会被分组在一起,而不是按照A到Z的顺序排列。
此外,<口<口<口<口<口之后的所有字符都是较不常见的中国汉字。因此,梵字比中字更不常见,所以它放置在<口<口<口<口<口之后。
我想知道为什么会做出这个决定,是否是故意的。但它会导致错误的排序。我不知道如何解决这个问题。