8

Java Collat​​orを使用して、大文字と小文字を区別する順序が実際にどのように機能するかを理解しようとしています。

このでは、次の文字列がすべての強度を使用してフランス語のロケールで並べ替えられています (説明のために、データ セットにいくつかの文字列を追加しました)。

[Äbc, äbc, Àbc, àbc, Abc, abc, ABC] - Original Data
[Äbc, äbc, Àbc, àbc, Abc, abc, ABC] Primary
[Abc, abc, ABC, Àbc, àbc, Äbc, äbc] Secondary
[abc, Abc, ABC, àbc, Àbc, äbc, Äbc] Tertiary

Case kicks in only with Tertiary Collation Strength  : 
[CACHE, cache, Cache, da, DA, Da] - Original Data
[CACHE, cache, Cache, da, DA, Da] Primary
[CACHE, cache, Cache, da, DA, Da] Secondary
[cache, Cache, CACHE, da, Da, DA] Tertiary

しかし、私が本当に期待していた結果は次のとおりです。

[abc, àbc, äbc, Abc, ABC, Àbc, Äbc] Tertiary
[cache, da, Cache, CACHE, Da, DA] Tertiary

言い換えれば、すべての小文字を最初に (アルファベット順に並べ替えて)、次に大文字 (またはその逆) にします。これは妥当な期待ではないでしょうか。

4

4 に答える 4

4

興味深いことに、android の javadocは oracle の javadoc よりも多少役に立ちます。特に:

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

また、注目に値する: 取得される順序は、フランス語ロケールで期待されるものです。「ordre alphabétique」に関するウィキペディアの記事によると:

初演の分析、アクセントの文字、魔法のような文字、オント・ル・ミームはアルファベットの文字を鳴らしました。
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, on a l'ordre e, é, è, ê, ë)

英語で(イタリック体で私が追加):

最初のステップは、アクセントや大文字と小文字に関係なく、文字をランク付けすることです (つまり、a,A,à ランク付けは同じです)。最初のステップの後に複数の単語のランクが同じである場合、大文字小文字とアクセント記号が考慮されます。

つまり、c(小型株) とD(大型株) は常に第 1 の強さでソート可能であり、第 3 の強さはその順序を変更しません。

したがって、あなたの例では、大文字小文字やアクセントに関係なく、常にcachebeforeがあります。da大文字と小文字が区別されるのは、最初の文字が同じである場合のみです ( c(小さい) とC(大きい) など)。

于 2013-09-16T12:27:51.890 に答える
0

ロケールに依存するコレーターの結果の順序について、仮定を立てるべきではありません。

これは、ASCII 順序などの技術的な側面を反映することを意図したものではなく、人間の言語規則 (たとえば、図書館の本のタイトルや電話帳の名前を並べ替えるなど) を反映することを意図しています。通常、大文字の本と小文字の本が分離された棚はありません。

さらに驚くべき動作を説明するために、次の例を見てください。

String s1="IDONTCARE", s2="idontcare";
System.out.println("Comparing '"+s1+"' and '"+s2+"' locale sensitive");
Locale[] all={ Locale.ENGLISH, new Locale("tr") };
for(Locale l:all)
{
  System.out.println();
  System.out.println(l);
  Collator c1=Collator.getInstance(l);
  c1.setStrength(Collator.PRIMARY);
  System.out.println("primary:\t"+c1.compare(s1, s2));
  c1.setStrength(Collator.SECONDARY);
  System.out.println("secondary:\t"+c1.compare(s1, s2));
  c1.setStrength(Collator.TERTIARY);
  System.out.println("tertiary:\t"+c1.compare(s1, s2));
  c1.setStrength(Collator.IDENTICAL);
  System.out.println("identical:\t"+c1.compare(s1, s2));
}

それは印刷されます:

Comparing 'IDONTCARE' and 'idontcare' locale sensitive

en
primary:    0
secondary:  0
tertiary:   1
identical:  1

tr
primary:    -1
secondary:  -1
tertiary:   -1
identical:  -1

前述のように、結果を知ることを期待せず、コレーターを使用した ASCII/Unicode 辞書式順序を忘れてください。

于 2013-09-18T16:37:25.707 に答える