2011-10-03 5 views
12

私はこのコードを持っています。フランス語とロシア語で正しく並べ替えられます。私は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); 
     } 
    } 
} 

更新: 申し訳ありませんが、私がために、すべての言語が含まれている必要があり、このセットを必要としません。私はこのセットが1つの言語を含み、各言語で正しく分類されていることを意味します。

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); 
     } 
    } 
} 
+4

を次のようにフランスの丁合いは、正しく単語の配列をソートします。 – Flexo

+3

セットに1つの言語しか含まれていなくても、ソートするたびに 'Collat​​or'の正しい' Locale'を選択する必要があります。 –

答えて

21

すべての言語に固有のアルファベット順があるため、できません。たとえば、

ロシア語は、指定したとおり、сの文字はトルコ語とは異なる順序を持っています。

常にcollat​​orを使用する必要があります。私があなたに提案できるのは、Collection APIです。 futher情報のチェックについては

// 
    // Define a collator for German language 
    // 
    Collator collator = Collator.getInstance(Locale.GERMAN); 

    // 
    // Sort the list using Collator 
    // 
    Collections.sort(words, collator); 

here

述べたこのプログラムは、2つの異なる丁合と単語の同じリストを並べ替えるとき、何が起こるかを示しとして:新しい(

丁合いfr_FRCollat​​or = Collat​​or.getInstanceロケール( "fr"、 "FR"));

Collat​​or en_USCollat​​or = Collat​​or.getInstance(新しいロケール( "en"、 "US"));

sortStringsと呼ばれるソート方法は、任意のCollat​​orで使用できます。フランス語の照合ルールによると

桃 PECHE PECHE 罪

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が言葉を並べ替え:sortStrings方法は、比較メソッドを呼び出していることに注意してください、上記のリストの順序が間違っています。フランス語では、pécheはソートされたリストでpêcheに従ってください。私はあなたが有意義言語間の単語の順序を定義することができるとは思わない

桃 PECHE PECHE 罪

1

として、私の知る、中国人は、彼らの言語のための任意の順序を持​​っていないJapanesが可能ひらがなやカタカナの順序を持​​っていますが、漢字ではそれが疑問です。しかし、コンピュータの中では、すべてが同じことが言語の歌を表す数字で表されています。各記号はユニークなUNICODE番号に対応しています。だから、これはUNICODEの位置を使って単語を並べ替えるあなたのための解決策かもしれません。

+2

中国語の漢字と漢字は、ラジカルとストローク数でソートできます。 –

9

使用している言語を正確に検出できたとしても、有用な照合順序は通常、特定の言語+国の組み合わせに固有です。また、言語+国でも、照合は用途や特定のカスタマイズによって異なる場合があります。

ただし、任意のテキストセットを並べ替える必要がある場合は、Unicode Collation Algorithmが最適です。これは、Unicodeテキストの言語に依存しない照合を定義しています。このアルゴリズムはカスタマイズ可能ですが、必ずしも1つのカルチャに意味をなさない結果をもたらす必要はありません(間違いなく)。

Javaの照合クラスはこのアルゴリズムを実装していませんが、ICU's RuleBaseCollatorの一部として利用できます。

+1

Javaでは、ロケール( "")を使用してルートロケールを取得します(Java 7では、Locale.ROOT定数があります)。このロケールのCollat​​orはUCAです。 –

関連する問題