我试着用Locale.SIMPLIFIED_CHINESE订购一份中文国家的名单,这似乎是用拼音(拼音字母,也就是按照拉丁文对应的组合排序,从A到Z)。
但我发现有些案子下得不好。例如:
正确的顺序应该是梵<中,而不是以另一种方式排序。
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规则。
此外,<口<口<口<口<口之后的所有字符都是较不常见的汉字。因此,与<口<口<口<口<口相比,梵是一个不常见的字符,因此它被放在中之后。
我不知道为什么这个决定,如果它是故意的。但它会导致错误的分类。我不知道怎么找到解决办法。
发布于 2016-01-15 12:49:09
Java中的排序器提供的排序顺序基于编写该字符所需的笔画。
见下面要演示的小片段。从维基百科获取的笔画数字
// the unicode character and the number of strokes
String[] characters = new String[]{
"\u68B5 (11)", "\u4E2D (4)",
"\u5207 (4)", "\u5973 (3)", "\u898B (7)"
};
List<String> list = Arrays.asList(characters);
System.out.println("Before sorting...");
System.out.println(list.toString());
Collator collator = Collator.getInstance(Locale.TRADITIONAL_CHINESE);
collator.setStrength(Collator.PRIMARY);
System.out.println();
Collections.sort(list, collator);
System.out.println("After sorting...");
System.out.println(list.toString());输出
Before sorting...
[梵 (11), 中 (4), 切 (4), 女 (3), 見 (7)]
After sorting...
[女 (3), 中 (4), 切 (4), 見 (7), 梵 (11)]有一个增强请求JDK-6415666根据Unicode排序规则来实现排序顺序。但是,根据有关支持Java 8的地区的信息,它不是在Java8中实现的。
编辑使用来自icu4j的排序器排序顺序是
[梵 (11), 見 (7), 女 (3), 切 (4), 中 (4)]ICU4J代码段
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.RuleBasedCollator
...
Locale locale = new Locale("zh", "", "PINYIN");
Collator collator = (RuleBasedCollator) Collator.getInstance(locale);https://stackoverflow.com/questions/33672422
复制相似问题