Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Collator的区分大小写的订单_Java_String_Sorting_Localization_Collation - Fatal编程技术网

使用Java Collator的区分大小写的订单

使用Java Collator的区分大小写的订单,java,string,sorting,localization,collation,Java,String,Sorting,Localization,Collation,我试图理解区分大小写的顺序应该如何使用 在下面的示例中,字符串在法语区域使用所有强度进行排序(为了便于说明,我在数据集中添加了一些额外的字符串): 但我真正期待的结果是: [abc, àbc, äbc, Abc, ABC, Àbc, Äbc] Tertiary [cache, da, Cache, CACHE, Da, DA] Tertiary 换句话说,我希望所有小写字母都放在第一位(按字母顺序排序),然后是大写字母(反之亦然)。这不是一个合理的期望吗?有趣的是,与oracle的期望相比,o

我试图理解区分大小写的顺序应该如何使用

在下面的示例中,字符串在法语区域使用所有强度进行排序(为了便于说明,我在数据集中添加了一些额外的字符串):

但我真正期待的结果是:

[abc, àbc, äbc, Abc, ABC, Àbc, Äbc] Tertiary
[cache, da, Cache, CACHE, Da, DA] Tertiary
换句话说,我希望所有小写字母都放在第一位(按字母顺序排序),然后是大写字母(反之亦然)。这不是一个合理的期望吗?

有趣的是,与oracle的期望相比,oracle的期望更有帮助,尤其是:

当字符串中的任何位置存在主差异或次差异时,将忽略第三个差异

同样值得注意的是:您得到的订单是您在法语地区所期望的。根据报告:

在première analysis,les caractères accentués,de mème que les majuscules,ont le mème rang alphabétique le caractère fondamental.
在主旋律和主旋律的区分上,我用了一个字母来表达我对主旋律和主旋律的理解

英文(我用斜体字补充):

第一步是对字母进行排序,不管它们的重音或大小写(即:a、a、a排列相同)。如果在第一步之后有几个单词具有相同的等级,那么将考虑大小写和重读

换句话说,
c
(小盘)和
D
(大盘)将始终可与一级强度排序,而三级强度不会改变该顺序


因此,在您的示例中,无论大小写和重音如何,在
da
之前始终有
cache
。只有当主字母相同时,大小写才会起作用(例如,
c
(小)与
c
(大)。

示例代码按预期工作。您可以使用自定义排序规则来获得所需的输出

是JDK中Collator的唯一子类。对Collator.getInstance(Locale.FRANCE)的调用返回RuleBasedCollector的实例

您可以使用

RuleBasedCollator myCollator = new RuleBasedCollator(rules);
中给出了规则的格式


希望它能有所帮助。

您不应该对区域设置敏感的排序结果进行假设

它不是要反映ASCII顺序等技术方面,而是人类语言规则,例如,人们会对图书馆中的书名或电话簿中的姓名进行排序。通常,你不会发现书架上的书是大写的,而书架上的书是小写的

要说明更令人惊讶的行为,请查看以下示例:

String s1="IDONTCARE", s2="idontcare";
System.out.println("Comparing '"+s1+"' and '"+s2+"' locale sensitive");
Locale[] all={ Locale.ENGLISH, new Locale("tr") };
for(Locale l:all)
{
  System.out.println();
  System.out.println(l);
  Collator c1=Collator.getInstance(l);
  c1.setStrength(Collator.PRIMARY);
  System.out.println("primary:\t"+c1.compare(s1, s2));
  c1.setStrength(Collator.SECONDARY);
  System.out.println("secondary:\t"+c1.compare(s1, s2));
  c1.setStrength(Collator.TERTIARY);
  System.out.println("tertiary:\t"+c1.compare(s1, s2));
  c1.setStrength(Collator.IDENTICAL);
  System.out.println("identical:\t"+c1.compare(s1, s2));
}
它将打印:

Comparing 'IDONTCARE' and 'idontcare' locale sensitive

en
primary:    0
secondary:  0
tertiary:   1
identical:  1

tr
primary:    -1
secondary:  -1
tertiary:   -1
identical:  -1

如前所述,不要期望知道结果,也不要忘记使用collator的ASCII/Unicode字典顺序。

另一个选项:如果需要自定义区域设置的规则,可以尝试使用基于规则的计算器:

    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);

我不理解你的怀疑。你希望拼贴器在设计上表现不同,还是结果让你惊讶?我希望得到不同的结果,并且对我得到的结果感到惊讶。所以我的问题是-如果这是设计的,如果是-如何实现我想要的?字符串比较默认使用字典顺序。您想要不同的东西吗?
compareTo
不是很有用,因为它不按本地化上下文中的字符串排序,而是按Unicode中定义的顺序排序。我需要在任意语言环境中对文本进行排序。如果您的语言环境包含reallyä和umlaut内容,我会使用带有语言环境的Collator和FULL_分解。不幸的是,我现在无法尝试,但我认为你会像这样实现你的目标。我把你的问题加入书签,以便做更精确的分析。谢谢你的回答。我不会说法语,也不能评论这个要求是否强烈,它出现在什么背景下,但在我的母语中没有这样的要求,但我得到了与法语相同的结果。我的主要观点是,人们习惯于这种大写字母在小写字母之前出现的情况,这主要是因为。它在其他编程语言中是如何工作的?还有一点很奇怪,互联网在这个问题上神秘地沉默了。@mindas:排序是关于人类语言顺序的,而不是关于技术的ASCII顺序。使用collator是有意识地反对字典(ASCII或Unicode)排序的决定。@mindas我想说的是(a)它是按照广告的方式工作的,(b)它恰好是法语中正确的字母顺序(你在字典中可以找到的顺序)。
    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);