Java排序规则忽略了空间

我最近意识到,Java Collat​​ion似乎忽略了空间。

我有以下术语列表:

Amman Jost Ammann Heinrich Ammanner Josef Bär Walter Bare Werner Barr Burt Barraud Maurice 

上面的订单反映了德国的所需订单,即占用空间。 但是,Java Collat​​ion使用

 Collator collator = Collator.getInstance(Locale.GERMANY); Collections.sort(values, collator); 

给我以下顺序:

 Amman Jost Ammanner Josef Ammann Heinrich Bare Werner Barraud Maurice Barr Burt Bär Walter 

上面的结果实际上并不是我所期望的,因为空间没有被考虑(看起来像这里描述的情况: 维基百科字母顺序 )。

这是否意味着,Java Collat​​ion不适用于此类用例,或者我在这里做错了什么? 有没有办法让Java Collat​​ion空间有意识?

我很乐意提出任何意见或建议。

您可以自定义排序规则。 尝试查看源代码,了解如何构建德语语言环境的Collat​​or,如本答案中所述 。

然后根据您的需求进行调整。 本教程给出了一个起点。 但是没有必要做所有的工作,其他人已经做过了:看到这篇博文文章处理捷克语完全相同的问题 。

上面链接的解决方案的本质是:

 String rules = ((RuleBasedCollator) Collator.getInstance(Locale.GERMANY)).getRules(); RuleBasedCollator correctedCollator = new RuleBasedCollator(rules.replaceAll("<'\u005f'", "<' '<'\u005f'")); 

这会在下划线规则之前为空格字符添加规则。

我承认我没有亲自测试过。

如果由于某些原因无法修改语言环境,那么我建议您自己编写所有内容。 这里有一些想法,虽然这段代码不完整但不起作用:

  • 而不是有一个字符串列表,创建自己的对象,实现可比较:

     public class myString implements Comparable { private String name; public myString(String name) { this.name = name; } } 
  • 然后你需要实现(参见这里的例子)

     public int compareTo(myString compareMyString) { ... } 
  • 现在来了更棘手的部分:

    • 为了比较你的字符串,你需要拆分它们(这将产生一个字符串数组)。 例如:

       // Original String "Barr Burt" // Splitted String [0]: "Barr" [1]: "Burt" 
    • 您需要一个接一个地比较单词。 创建一个像这样的函数(这是一个伪代码:“this.words [i]”调用第一个单词“this.name”)

       public int compareWords(myString compareMyString, int i) { if (this.words[i] < compareMyString.words[i]) return -1; // "this" should come before "compareMyString" if (this.words[i] > compareMyString.words[i]) return 1; // "this" should come after "compareMyString" if (this.words[i] == compareMyString.words[i]) return compareWords(i+1); } 
    • 然后比较到:

       public int compareTo(myString compareMyString) { return compareWords(compareMyString, 0); }