使用Java Collator的区分大小写的顺序
我正在尝试使用Java Collator来了解区分大小写的顺序应该如何工作。
在这个例子中,下面的字符串使用所有强度在法语语言环境中进行排序(为了说明的目的,我在数据集中添加了一些额外的字符串):
[Äbc, äbc, Àbc, àbc, Abc, abc, ABC] - Original Data
[Äbc, äbc, Àbc, àbc, Abc, abc, ABC] Primary
[Abc, abc, ABC, Àbc, àbc, Äbc, äbc] Secondary
[abc, Abc, ABC, àbc, Àbc, äbc, Äbc] Tertiary
Case kicks in only with Tertiary Collation Strength :
[CACHE, cache, Cache, da, DA, Da] - Original Data
[CACHE, cache, Cache, da, DA, Da] Primary
[CACHE, cache, Cache, da, DA, Da] Secondary
[cache, Cache, CACHE, da, Da, DA] Tertiary
但我真正期待的结果是:
[abc, àbc, äbc, Abc, ABC, Àbc, Äbc] Tertiary
[cache, da, Cache, CACHE, Da, DA] Tertiary
换句话说,我希望所有的小写字母首先按字母顺序排列,然后是大写字母(反之亦然)。 这是不是一个合理的期望?
有趣的是,android javadoc比oracle更有用 - 特别是:
当字符串中的任何位置存在主要或次要区别时,第三个区别将被忽略。
另外值得注意的是:您获得的订单是您在法语区域中所期望的。 根据维基百科关于“ordrealphabétique”的文章:
Enpremièreanalyze,lescaractèresaccentués,demêmeque les majuscules,ont lemêmerangalphabétiqueque lecaractèrefondamental。
Si plusieurs mots ont lemêmerangalphabétique,on thetâchede distiner entre euxgrâceaux majuscules et aux accents(pour le e,on l'ordre e,é,è,ê,ë)
英文(我加斜体):
第一步是对信件进行排名,不管其重音或情况如何(即:a,A,à排名相同)。 如果几个单词在第一步之后具有相同的排名,则会考虑大小写和重音。
换句话说, c
(小型帽)和D
(大型帽)总是可以用主要力量排序,而第三方力量不会改变这个顺序。
因此,在您的示例中,无论大小写和口音如何,您都会在da
之前拥有cache
。 如果主要字母相同(例如c
(小)与C
(大)),则情况只会有所不同。
示例代码正在按预期工作。 您可以使用自定义整理规则来获取所需的输出。
RuleBasedCollator是JDK中Collator的唯一子类。 您对Collator.getInstance(Locale.FRANCE)的调用返回RuleBasedCollator的一个实例
你可以使用创建你自己的实例
RuleBasedCollator myCollator = new RuleBasedCollator(rules);
规则的格式在javadoc中给出。
希望能帮助到你。
另一种选择:如果您需要自定义语言环境的规则,则可以尝试使用RuleBasedCollator:
RuleBasedCollator collTemp = (RuleBasedCollator) Collator.getInstance(Locale.US);
String usRules = collTemp.getRules();
//Remove dashes rule from US locale (dashes come after letters)
usRules = usRules.replace(",'-'", "");
//Create a collator with customized rules
RuleBasedCollator coll = new RuleBasedCollator(usRules);
//Sort the collection based on collator
Collections.sort(lines, coll);
链接地址: http://www.djcxy.com/p/74305.html