首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Locale.SIMPLIFIED_CHINESE对排序器进行错误排序

使用Locale.SIMPLIFIED_CHINESE对排序器进行错误排序
EN

Stack Overflow用户
提问于 2015-11-12 13:22:07
回答 1查看 1.3K关注 0票数 12

我试着用Locale.SIMPLIFIED_CHINESE订购一份中文国家的名单,这似乎是用拼音(拼音字母,也就是按照拉丁文对应的组合排序,从A到Z)。

但我发现有些案子下得不好。例如:

  • '中‘字符是中
  • '梵‘字符是梵

正确的顺序应该是梵<中,而不是以另一种方式排序。

代码语言:javascript
复制
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());

此片段的结果如下:

代码语言:javascript
复制
Before sorting...
[梵, 中]
After sorting...
[中, 梵]

更进一步,我发现了Java应用于Locale.SIMPLIFIED_CHINESE的规则。您可以在下一张图片中找到:https://postimg.cc/image/4t915a7gp/full/ (请注意,梵在中之后)

我意识到,在<口<口<口<口<口之前,我用红色高亮显示,所有字符都是按照拉丁文对应的组合排序的,从A到Z。但是,在<口<口<口<口<口符号之后,字符是根据字符的组合排列的。例如,如果所有字符都有相同的部分(通常是字符的左边部分),那么它们就会被分组在一起,而不是按照A到Z规则。

此外,<口<口<口<口<口之后的所有字符都是较不常见的汉字。因此,与<口<口<口<口<口相比,梵是一个不常见的字符,因此它被放在中之后。

我不知道为什么这个决定,如果它是故意的。但它会导致错误的分类。我不知道怎么找到解决办法。

EN

回答 1

Stack Overflow用户

发布于 2016-01-15 12:49:09

Java中的排序器提供的排序顺序基于编写该字符所需的笔画。

见下面要演示的小片段。从维基百科获取的笔画数字

代码语言:javascript
复制
// 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());

输出

代码语言:javascript
复制
Before sorting...
[梵 (11), 中 (4), 切 (4), 女 (3), 見 (7)]

After sorting...
[女 (3), 中 (4), 切 (4), 見 (7), 梵 (11)]

有一个增强请求JDK-6415666根据Unicode排序规则来实现排序顺序。但是,根据有关支持Java 8的地区的信息,它不是在Java8中实现的。

编辑使用来自icu4j的排序器排序顺序是

代码语言:javascript
复制
[梵 (11), 見 (7), 女 (3), 切 (4), 中 (4)]

ICU4J代码段

代码语言:javascript
复制
import com.ibm.icu.text.Collator;
import com.ibm.icu.text.RuleBasedCollator
...
Locale locale = new Locale("zh", "", "PINYIN");
Collator collator = (RuleBasedCollator) Collator.getInstance(locale);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33672422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档