全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
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);
 
 
 
 RuleBasedCollator(String)
	RuleBasedCollator(String)
   
 clone()
	clone()
   compare(String, String)
	compare(String, String)
   equals(Object)
	equals(Object)
   getCollationElementIterator(String)
	getCollationElementIterator(String)
   getCollationKey(String)
	getCollationKey(String)
   getRules()
	getRules()
   hashCode()
	hashCode()
   
 RuleBasedCollator
RuleBasedCollator
public RuleBasedCollator(String rules) throws ParseException
 
 getRules
getRules
public String getRules()
 getCollationElementIterator
getCollationElementIterator
public CollationElementIterator getCollationElementIterator(String source)
 compare
compare
  public int compare(String source,
                     String target)
 getCollationKey
getCollationKey
public CollationKey getCollationKey(String source)
 clone
clone
public Object clone()
 equals
equals
public boolean equals(Object obj)
 hashCode
hashCode
public int hashCode()
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス