Java プラットフォーム 1.2

java.text
クラス RuleBasedCollator

java.lang.Object
  |
  +--java.text.Collator
        |
        +--java.text.RuleBasedCollator

public class RuleBasedCollator
extends Collator

RuleBasedCollator クラスは Collator の具象サブクラスで、簡単な操作でデータドリブンのテーブルコレータを使用可能にします。このクラスを使うと、カスタマイズしたテーブルベースの Collator を作成することができます。RuleBasedCollator は、文字をソートキーにマップします。

効率化のために、RuleBasedCollator には次の制約があります (さらに複雑な言語には他のサブクラスが使用される) 。

  1. フランス語の 2 次順序が指定されると、コレータオブジェクト全体に適用される
  2. 記述のないすべての Unicode 文字は、照合順序の最後にくる

照合テーブルは照合ルールのリストからなり、それぞのルールは次の 3 つの形式をとります。

    < 修飾子 >
    < 関係文字 > < テキスト引数 >
    < リセット文字 > < テキスト引数 >
 
照合ルールの作成方法を次に示します。

これは実際よりも複雑に見えます。たとえば次の例は、同じことを同等の方法で表したものです。

 a < b < c
 a < b < b < c
 a < c < a < b
 
テキスト引数のすぐ後に次の項目がくるので、順序が重要です。次の例は、同等ではありません。
 a < b & a < 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 < b" であるべき)。しかし、最初の関係文字が "<" でなければ、最初の "<" までのすべてのテキスト引数は無視できます。たとえば、", - < a < b" では "-" が無視できる文字です。これは、前に "black-birds" という語で見たとおりです。他の言語の例を見れば、ほとんどのアクセントが無視できることがわかります。

正規化とアクセント

RuleBasedCollator は自動的にそのルールテーブルを処理することにより、事前合成済みバージョンと結合文字バージョンのアクセント付き文字がどちらも含まれるようにします。提供されているルール文字列がベース文字と独立した結合アクセント文字からのみ構成される場合、ルール文字列の文字のすべての標準的な組み合わせに一致する事前合成済みアクセント付き文字がテーブルに入力されます。

これで、コレータが NO_DECOMPOSITION に設定されているときでも、RuleBasedCollator を使ってアクセント付き文字列を比較できます。ただし、注意すべき点が 2 つあります。1 つ目は、照合対象の文字列が標準的な順序にない結合シーケンスを保持している場合、コレータを CANONICAL_DECOMPOSITION または FULL_DECOMPOSITION に設定して結合シーケンスのソートを可能にする必要があるということです。もう 1 つは、文字列が分解互換の文字 (完全幅や半分幅などの形式) を保持する場合、ルールテーブルには標準的なマッピングのみが含まれるので FULL_DECOMPOSITION を使う必要があるということです。詳細は、「The Unicode Standard, Version 2.0」を参照してください。

エラー

次の場合は、エラーになります。

これらのエラーのうちどれかがあると、RuleBasedCollatorParseException をスローします。

簡単な例: "< 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 < å=a?,Å=A? ;aa,AA< æ,Æ< ø,Ø"

通常、ルールベースの 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" +
                 "< å=a?,Å=A?" +
                 ";aa,AA< æ,Æ< ø,Ø";
 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
 

もう 1 つの例では、既存のテーブルを変更して新しい 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 = "=?;?;?;?"    // main accents
                 + ";?;?;?;?"    // main accents
                 + ";?;?;?;?"    // main accents
                 + ";?;?;?;?"    // main accents
                 + ";?;?;?;?"    // main accents
                 + "< a , A ; ae, AE ; æ , Æ"
                 + "< b , B < c, C < e, E & C < d, D";
 // change the order of accent characters
 String addOn = "& ? ; ? ; ?";
 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 = "& ? <?, ? <?, ?";
 RuleBasedCollator myJapaneseCollator = new
     RuleBasedCollator(en_USCollator.getRules() + jaString);
 

関連項目:
Collator, CollationElementIterator

クラス java.text.Collator から継承したフィールド
CANONICAL_DECOMPOSITION, FULL_DECOMPOSITION, IDENTICAL, NO_DECOMPOSITION, PRIMARY, SECONDARY, TERTIARY
 
コンストラクタの概要
RuleBasedCollator(String rules)
          RuleBasedCollator のコンストラクタです。
 
メソッドの概要
 Object clone()
          標準オーバーライドです。
 int compare(String source, String target)
          2 つの異なる文字列に格納された文字データを、照合ルールに従って比較します。
 boolean equals(Object obj)
          2 つの照合オブジェクトが等しいかどうかを比較します。
 CollationElementIterator getCollationElementIterator(CharacterIterator source)
          指定された String の CollationElementIterator を返します。
 CollationElementIterator getCollationElementIterator(String source)
          指定された String の CollationElementIterator を返します。
 CollationKey getCollationKey(String source)
          文字列を、CollationKey.compareTo で比較できる一連の文字に変換します。
 String getRules()
          照合オブジェクトに対するテーブルベースルールを取得します。
 int hashCode()
          テーブルベース照合オブジェクトのハッシュコードを生成します。
 
クラス java.text.Collator から継承したメソッド
compare, equals, getAvailableLocales, getDecomposition, getInstance, getInstance, getStrength, setDecomposition, setStrength
 
クラス java.lang.Object から継承したメソッド
finalize, getClass, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

RuleBasedCollator

public RuleBasedCollator(String rules)
                  throws ParseException
RuleBasedCollator のコンストラクタです。テーブルルールから照合テーブルを構築します。照合ルール構文の詳細は、RuleBasedCollator クラスの説明を参照してください。
パラメータ:
rules - 照合テーブルを構築する元になる照合ルール
例外:
ParseException - ルールの構築プロセスが失敗すると、フォーマット例外がスローされる。たとえば、構築ルールの "a < ? < d" は「?」が引用符で囲まれていないので、コンストラクタにより ParseException がスローされる
メソッドの詳細

getRules

public String getRules()
照合オブジェクトに対するテーブルベースルールを取得します。
戻り値:
テーブル照合オブジェクトが作成される元になった照合ルール

getCollationElementIterator

public CollationElementIterator getCollationElementIterator(String source)
指定された String の CollationElementIterator を返します。
関連項目:
CollationElementIterator

getCollationElementIterator

public CollationElementIterator getCollationElementIterator(CharacterIterator source)
指定された String の CollationElementIterator を返します。
関連項目:
CollationElementIterator

compare

public int compare(String source,
                   String target)
2 つの異なる文字列に格納された文字データを、照合ルールに従って比較します。ある言語において、ある文字列が、別の文字列より大きいか、小さいか、または等しいかを返します。これは、サブクラスでオーバーライドすることができます。
オーバーライド:
クラス Collator 内の compare

getCollationKey

public CollationKey getCollationKey(String source)
文字列を、CollationKey.compareTo で比較できる一連の文字に変換します。これは、java.text.Collator.getCollationKey をオーバーライドします。また、サブクラスでオーバーライドすることができます。
オーバーライド:
クラス Collator 内の getCollationKey

clone

public Object clone()
標準オーバーライドです。セマンティクスは変わりません。
オーバーライド:
クラス Collator 内の clone

equals

public boolean equals(Object obj)
2 つの照合オブジェクトが等しいかどうかを比較します。
パラメータ:
obj - 比較対象のテーブルベースの照合オブジェクト
戻り値:
現在のテーブルベースの照合オブジェクトが、テーブルベースの照合オブジェクト obj に等しい場合は true、そうでない場合は false
オーバーライド:
クラス Collator 内の equals

hashCode

public int hashCode()
テーブルベース照合オブジェクトのハッシュコードを生成します。
オーバーライド:
クラス Collator 内の hashCode

Java プラットフォーム 1.2

バグや機能要求の報告
新しい javadoc の表示についてのコメントやご提案
Java は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-1998 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.