2012-02-21 5 views
7

Androidで国際文字列を正しく並べ替える方法はありますか?カスタムコンパレータを使用し、compareTo()メソッドを使用しますが、それだけでは不十分です。私はこの "ö"のような文字を "o"の近くに表示したいが、それらはすべてリストの最後にある。コンパイラに「o、a、...など」と似ていると考えるようにするにはどうすればよいですか?Androidで特殊文字を比較する

答えて

15

ロケールに敏感な文字列を使用すると、Collatorが使用されます。 docs:

ロケール依存文字列比較を実行します。具体的なサブクラスである RuleBasedCollat​​orを使用すると、照合順序のカスタマイズを によって行うことができます。比較ストリングの

例:

Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;) 
System.out.println(deCollator.compare("abcö", "abco")); 

プリント1


あなたはコレータの上使用して文字列のリストをソートしたい場合は、あなたが書くことができます。

final List<String> strings = Arrays.asList(
     "über", "zahlen", "können", "kreativ", "Äther", "Österreich"); 
Collections.sort(strings, deCollator); // Collator implements Comparator 
System.out.println(strings); 

プリント:

[Äther, können, kreativ, Österreich, über, zahlen] 

編集:ちょうどあなたがポーランドであることを発見しました、ポーランドの例を以下に示します:

final List<String> strings = Arrays.asList(
     "pięć", "piec", "Pieczka", "pięść", "pieczęć", "pieczątka"); 
Collections.sort(strings, Collator.getInstance(new Locale("pl", "PL"))); 
System.out.println(strings); 
// output: [piec, pieczątka, pieczęć, Pieczka, pięć, pięść] 
+0

あなたの素晴らしい答えをありがとう! ;)実際、私はもっと簡単な解決策を見つけました: 'Collat​​or collat​​or = Collat​​or.getInstance(); collat​​or.setDecomposition(Collat​​or.CANONICAL_DECOMPOSITION); collat​​or.compare(one、two) 'ここでの2番目の例は、CANO​​NICAL_DECOMPOSITIONルールの動作を示しています。http://developer.android.com/reference/java/text/Collat​​or.html – lomza

+1

Collat​​or.getInstance ) '明示的な' Locale'が環境依存でない場合、**ユーザのデフォルトロケール**に適したCollat​​orインスタンスを返します。 「[デフォルトのロケールに注意してください](http://developer.android.com/reference/java/util/Locale.html#default_locale)」._ – Xaerxess

+0

警告をありがとうございますが、今は疑いがあります。ソートされたデータは、ユーザーに表示するためだけに、どこかに送信したり、何かを計算したりする必要がありません。おそらくデフォルトのロケールで十分でしょうか?しかし、私がドイツ語とデンマーク語の文字を正しくソートして機械出力として使用したいのであれば、最良の選択は 'Local.US'ロケールを使うことでしょうか? – lomza