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

时间:2011-10-03 10:05:01

标签: java collation string-comparison

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

public class CollationTest {
    public static void main(final String[] args) {
        final Collator collator = Collator.getInstance(Locale.US);
        final SortedSet<String> set = new TreeSet<String>(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<String> set = new TreeSet<String>(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);
        }
    }
}

3 个答案:

答案 0 :(得分:23)

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

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

你应该总是使用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);

进一步检查信息并按照here

说明

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

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

英国整理人员按如下方式对单词进行排序:

桃 PÊCHE PÊCHE 罪

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

桃 PÊCHE PÊCHE 罪

答案 1 :(得分:10)

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

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

Java的排序规则类没有实现此算法,但它作为ICU's RuleBaseCollator的一部分提供。

答案 2 :(得分:0)

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