2012-08-10 5 views
7

私はstrings.Iを比較する上で問題が-1を出力します。このJavaのCollat​​ionKeyが間違っ

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("éd"); 
CollationKey b = localeSpecificCollator.getCollationKey("ef"); 
System.out.println(a.compareTo(b)); 

このように二つの「ED」と「EF」、フランス語のテキストを比較したい持っているが、フランス語のアルファベットでeは前に来ますé。我々は唯一のeé

このような
Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("é"); 
CollationKey b = localeSpecificCollator.getCollationKey("e"); 
System.out.println(a.compareTo(b)); 

を比較するときしかし、結果は1です。コードの最初の部分で何が間違っているかを教えてください。 JavaDocから

+1

私は '' Swing' Comparator'とRowSorter'のためのその実装 'Win1250-2' EQの' 'JTable'でand' RowFilter'と "同じ問題を"(私はかなり許容できると思います)があります。 'ISO 8859-1/2 '、タンクは、例えばEの端に注文されたすべての非ASCIIのために - > EのEI、申し訳ありません – mKorbel

答えて

3

これは予期された動作であると思われ、フランス語でアルファベット順に並べ替える正しい方法のようです。

Android javadocは、それがそのように動作している理由についてのヒントを提供します - 私が同一でない場合にはアンドロイドでの実装の詳細は、似ていると仮定し、標準のJDKに:

三次違い文字列のどこにでもプライマリまたはセカンダリの違いがある場合は無視されます。

つまり、2つの文字列が主要な差異(アクセント記号を除く)のみを参照することでソート可能であるため、照合器は他の差異をチェックしません。

Unicode Collation Algorithm (UCA)に準拠するようだ:基本文字が異なる場合

アクセントの違いは、一般的に、無視されます。

そして、それaussi wikipedia article on "ordre alphabetique" selon、フランス語でアルファベット順に綴るための適切な方法であるように思わ:

最初の分析、アクセント記号だけでなく、首都では、同じランクを持っています複数の単語が同じアルファベットのランクを持っている場合は基本的な文字
は、我々は彼らに上限とアクセントのおかげで区別しよう ことをアルファベット順

(Eため、E、E、E、E順番電子ました)
英語で

:順序は最初のアクセントとケースを無視する - 二つの言葉がそのようにソートすることができない場合は、アクセントとケースはその後に考慮されています。

0

あなたは比較で重要と見なさ差のレベルを決定するためにCollat​​orの強さ属性を設定することができます。 PRIMARY、SECONDARY、TERTIARY、およびIDENTICALの4つの強みが提供されています。言語機能への強みの正確な割り当ては、ロケールに依存します。たとえば、チェコ語では「e」と「f」は主な差異とみなされ、「e」と「e」は二次的な差異であり、「e」と「E」は三次的な差異であり、「e」と「e」は同一である。

異なる強度試してみてください:

localeSpecificCollator.setStrength(Collator.PRIMARY); 

をし、何が起こるかを参照してください。

+1

とかなり許容され、論理的な順序ですので、私はすべての強度の向上を試みていると、その解決に必要なことはありません、それが主な相違点がある場合は、二次/三次の違いが考慮されていない – Ashot

+1

@Tichodromaを助けていない目指しています。 – assylias

関連する問題