7

文字列の比較に問題があります。「ed」と「ef」の 2 つのフランス語テキストをこのように比較したい

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

これは印刷されます-1が、フランス語のアルファベットでeは が前に来éます。ただ、比較してみるeéこんな感じ

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

結果は1。コードの最初の部分で何が間違っているか教えていただけますか?

4

2 に答える 2

5

これは予想される動作のようであり、フランス語でアルファベット順にソートする正しい方法でもあるようです。

Android javadocは、なぜそのように振る舞うかについてのヒントを提供します.Androidでの実装の詳細は、標準のJDKと同一ではないにしても、似ていると思います:

文字列のどこかに一次または二次の違いがある場合、三次の違いは無視されます。

つまり、2 つの文字列は主な違い (アクセントを除く) だけを見てソートできるため、コレーターは他の違いをチェックしません。

Unicode Collat​​ion Algorithm (UCA)に準拠しているようです:

基本文字が異なる場合、アクセントの違いは通常無視されます。

また、「ordre alphabetique」に関するウィキペディアの記事によると、フランス語でアルファベット順にソートする正しい方法でもあるようです。

En première analyse, les caractères accentués, de même que les majuscules, ont le même rang alphabétique que le caractère fontamental
Si plusieurs mots ont le même rang alphabétique, on tâche de les distinguer entre eux grâce aux majuscules et auxアクセント (pour le e, l'ordre e, é, è, ê, ë)

英語の場合: 最初はアクセントと大文字と小文字が無視されます。2 つの単語をそのように並べ替えることができない場合は、アクセントと大文字と小文字が考慮されます。

于 2012-08-10T13:17:59.017 に答える
0

JavaDocから:

Collat​​orの強度プロパティを設定して、比較で重要と見なされる差異のレベルを決定できます。4つの長所が提供されます:PRIMARY、SECONDARY、TERTIARY、およびIDENTICAL。言語機能への強みの正確な割り当ては、ロケールによって異なります。たとえば、チェコ語では、「e」と「f」は一次差異と見なされ、「e」と「ě」は二次差異、「e」と「E」は三次差異、「e」と「e」は同一です。 。

さまざまな長所を試してみてください。

localeSpecificCollator.setStrength(Collator.PRIMARY);

何が起こるか見てみましょう。

于 2012-08-10T10:15:49.207 に答える