全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
java.lang.Object | +----java.text.Collator | +----java.text.RuleBasedCollator
RuleBasedCollator
クラスはCollator
の concreteサブクラスで、簡単な操作で、データ起動のテーブルコレータを使用可能にします。このクラスを使うと、カストマイズしたテーブルベースの Collator
を作成することができます。RuleBasedCollator
は、文字をソートキーにマップします。
効率のために、RuleBasedCollator
には次の制約があります(さらに複雑な言語には他のサブクラスを使用することができます)。
照合テーブルは照合ルールのリストから成り、それぞのルールは次の3つの形式をとります。
< 修飾子 > < 関係 > < テキスト引数 > < リセット > < テキスト引数>照合ルールの作成方法を次に示します。
'@' : アクセントがフランス語のように逆方向にソートされることを示します。
'&' : 次のルールが、リセットテキスト引数がソートされる位置に続くことを示す。
これは実際よりも複雑に聞こえます。たとえば、次の例は、同じことを同等の方法で表したものです。
テキスト引数のすぐ後に次の項目が来るので、順序が重要です。次の2つは同じではありません。a < b < c a < b & b < c a < c & a < b
シーケンスには、テキスト引数がすでに存在するか、そのテキスト引数の最初の副文字列が存在しなければなりません。(たとえば、"a < b & ae < e" は有効です。シーケンスにおいて"a"は、"ae"がリセットされるより前にあるからです。)この後のケースで、"ae"は1文字として入力されませんし、そのようには扱われません。"e"は、2文字("a"に続く"e")に拡張されたかのようにソートされます。この違いは、自然言語に見られます。従来のスペイン語の"ch"は、単一文字に短縮されたかのように処理されます ("c < ch < d"と表現される)。一方、従来のドイツ語の"a" (aウムラウト)は、2つの文字に拡張されたかのように処理されます("a,A < b,B ... & ae,a & AE,A"と表現される)。a < b & a < c a < c & a < b
無視可能な文字
無視可能な文字の場合、最初のルールは、関係で始まらなければなりません(上の例は実際には一部を表しています。つまり、"a < b"は実際には "< a < b"であるべきものです)。しかし、最初の関係が"<"でなければ、最初の"<"までのすべてのテキスト引数は無視できます。たとえば、", - < a < b"では "-" が無視できる文字です。これは、前に"black-birds"というワードで見たとおりです。他の言語の例を見れば、ほとんどのアクセントが無視できることがわかります。
正規化とアクセント
Collator
オブジェクトは、可能な限り、テキストを内部的に正規化して、ベースの文字からアクセントを切り離します。これは、ルールを処理するときと、2つの文字列を比較するときに行われます。さらに、Collator
は、Unicode正規ッピングを使って、結合された複数のシーケンスが正しくソートされるようにします。(詳しくは、The Unicode Standard, Version 2.0を参照してください。)
エラー
次の場合は、正しくありません。
RuleBasedCollator
が ParseException
をスローします。
例
簡単な例: "< a < b < c < d"
ノルウェー語: "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J < k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T < u,U< v,V< w,W< x,X< y,Y< z,Z < \u00E5=a\u030A,\u00C5=A\u030A ;aa,AA< \u00E6,\u00C6< \u00F8,\u00D8"
通常、ルールベースのCollatorオブジェクトを作成するには、Collator
のファクトリメソッド getInstance
を使用します。しかし、ニーズに合わせた特殊なルールをもつルールベースのCollatorオブジェクトを作成するには、String
オブジェクトにルールを指定して、RuleBasedCollator
を構築します。たとえば、次のようにします。
または:String Simple = "< a < b < c < d"; RuleBasedCollator mySimple = new RuleBasedCollator(Simple);
String Norwegian = "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J" + "< k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T" + "< u,U< v,V< w,W< x,X< y,Y< z,Z" + "< \u00E5=a\u030A,\u00C5=A\u030A" + ";aa,AA< \u00E6,\u00C6< \u00F8,\u00D8"; RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
Collator
を結合するのは、文字列を結合するとの同じくらい簡単です。次の例は、2つの異なるロケールの2つの Collator
を結合する例です。
// Create an en_US Collator object RuleBasedCollator en_USCollator = (RuleBasedCollator) Collator.getInstance(new Locale("en", "US", "")); // Create a da_DK Collator object RuleBasedCollator da_DKCollator = (RuleBasedCollator) Collator.getInstance(new Locale("da", "DK", "")); // Combine the two // First, get the collation rules from en_USCollator String en_USRules = en_USCollator.getRules(); // Second, get the collation rules from da_DKCollator String da_DKRules = da_DKCollator.getRules(); RuleBasedCollator newCollator = new RuleBasedCollator(en_USRules + da_DKRules); // newCollator has the combined rules
もう一つ面白い例は、既存のテーブルを変更して新しい Collator
オブジェクトを作成する場合です。たとえば、"& C < ch, cH, Ch, CH"を en_USCollator
オブジェクトに追加して、独自のテーブルを作成します。
// Create a new Collator object with additional rules String addRules = "& C < ch, cH, Ch, CH"; RuleBasedCollator myCollator = new RuleBasedCollator(en_USCollator + addRules); // myCollator contains the new rules
次の例は、ノンスペーシングアクセントの順序を変更する方法を示しています。
// old rule String oldRules = "=\u0301;\u0300;\u0302;\u0308" // main accents + ";\u0327;\u0303;\u0304;\u0305" // main accents + ";\u0306;\u0307;\u0309;\u030A" // main accents + ";\u030B;\u030C;\u030D;\u030E" // main accents + ";\u030F;\u0310;\u0311;\u0312" // main accents + "< a , A ; ae, AE ; \u00e6 , \u00c6" + "< b , B < c, C < e, E & C < d, D"; // change the order of accent characters String addOn = "& \u0300 ; \u0308 ; \u0302"; RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn);
最後の例では、新しい主要順序をデフォルトの設定より前に置く方法を示します。たとえば、日本語 Collator
では、英語の文字を日本語の文字より前にソートすることも、後にソートすることもできます。
// get en_US Collator rules RuleBasedCollator en_USCollator = (RuleBasedCollator)Collator.getInstance(Locale.US); // add a few Japanese character to sort before English characters // suppose the last character before the first base letter 'a' in // the English collation rule is ? String jaString = "& \u2212 < \u3041, \u3042 < \u3043, \u3044"; RuleBasedCollator myJapaneseCollator = new RuleBasedCollator(en_USCollator.getRules() + jaString);
public RuleBasedCollator(String rules) throws ParseException
public String getRules()
public CollationElementIterator getCollationElementIterator(String source)
public int compare(String source, String target)
public CollationKey getCollationKey(String source)
public Object clone()
public boolean equals(Object obj)
public int hashCode()
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス