有没有办法对所有语言的字符串进行排序?

我有这个代码。 它用法语和俄语正确排序。 我使用Locale.US似乎是对的。 这个解决方案适用于所有语言吗? 它适用于其他语言吗? 例如:中国人,韩国人,日本人……如果没有,有什么更好的解决方案?

public class CollationTest { public static void main(final String[] args) { final Collator collator = Collator.getInstance(Locale.US); final SortedSet set = new TreeSet(collator); set.add("abîmer"); set.add("abîmé"); set.add("aberrer"); set.add("abhorrer"); set.add("aberrance"); set.add("abécédaire"); set.add("abducteur"); set.add("abdomen"); set.add("государственно-монополистический"); set.add("гостить"); set.add("гостевой"); set.add("гостеприимный"); set.add("госпожа"); set.add("госплан"); set.add("господи"); set.add("господа"); for(final String s : set) { System.out.println(s); } } } 

更新:对不起,我不要求这个集合必须包含所有语言。 我的意思是这个集包含一种语言并且在每种语言中都能正确排序

 public class CollationTest { public static void main(final String[] args) { final Collator collator = Collator.getInstance(Locale.US); final SortedSet set = new TreeSet(collator); // Sorting in French. set.clear(); set.add("abîmer"); set.add("abîmé"); set.add("aberrer"); set.add("abhorrer"); set.add("aberrance"); set.add("abécédaire"); set.add("abducteur"); set.add("abdomen"); for(final String s : set) { System.out.println(s); } // Sorting in Russian. set.clear(); set.add("государственно-монополистический"); set.add("гостить"); set.add("гостевой"); set.add("гостеприимный"); set.add("госпожа"); set.add("госплан"); set.add("господи"); set.add("господа"); for(final String s : set) { System.out.println(s); } } } 

因为每种语言都有自己的字母顺序,所以你不能。 例如,

你所说的俄语有с字母与土耳其语有不同的顺序。

你应该总是使用collat​​or。 我建议你的是我们的Collection API。

  // // Define a collator for German language // Collator collator = Collator.getInstance(Locale.GERMAN); // // Sort the list using Collator // Collections.sort(words, collator); 

有关进一步的信息检查和此处说明

此程序显示当您使用两个不同的collat​​ors对相同的单词列表进行排序时会发生什么:

Collat​​or fr_FRCollat​​or = Collat​​or.getInstance(new Locale(“fr”,“FR”));

Collat​​or en_USCollat​​or = Collat​​or.getInstance(new Locale(“en”,“US”));

排序方法(称为sortStrings)可以与任何Collat​​or一起使用。 请注意,sortStrings方法调用compare方法:

  public static void sortStrings(Collator collator, String[] words) { String tmp; for (int i = 0; i < words.length; i++) { for (int j = i + 1; j < words.length; j++) { if (collator.compare(words[i], words[j]) > 0) { tmp = words[i]; words[i] = words[j]; words[j] = tmp; } } } } 

英国Collat​​or对单词进行如下排序:

peachpéchépêchesin

根据法语的整理规则,前面的列表顺序错误。 在法语中,péché应该在排序列表中跟随pêche。 French Collat​​or正确地对单词数组进行排序,如下所示:

peachpêchepéchésin

即使您可以准确地检测所使用的语言,有用的整理顺序通常也特定于特定语言+国家/地区组合。 即使在语言+国家/地区内,整理也可能因使用情况或某些自定义而异。

但是,如果您确实需要对任意文本集进行排序,最好的选择是Unicode排序算法 ,它为任何Unicode文本定义了与语言无关的排序规则 。 该算法是可定制的,但没有必要给出对任何一种文化都有意义的结果(绝对不能跨越它们)。

Java的排序规则类不实现此算法,但它可作为ICU的RuleBaseCollat​​or的一部分使用。

据我所知,中国人对他们的语言没有任何命令,日本人可能在平假名或片假名中有命令,但在汉字中这是令人怀疑的。 但是在计算机科学方面,一切都用数字表示,语言唱歌也是如此。 每个符号对应唯一的UNICODE编号。 所以这可能是你的解决方案,使用他们的UNICODE职位对单词进行排序。

Interesting Posts