モジュール java.base
パッケージ java.text

クラスRuleBasedCollator

java.lang.Object
java.text.Collator
java.text.RuleBasedCollator
すべての実装されたインタフェース:
Cloneable, Comparator<Object>

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

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

  1. <修飾子>によって制御される特別な照合ルールが指定されると、コレータ・オブジェクト全体に適用される。
  2. 記述のないすべての文字は、照合順序の最後にくる。

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

    <modifier>
    <relation> <text-argument>
    <reset> <text-argument>
 
ルール要素の定義は次のとおりです。
  • テキスト引数:テキスト引数は、特殊文字(つまり、一般的な空白文字[0009-000D, 0020]とルール構文文字[0021-002F, 003A-0040, 005B-0060, 007B-007E])以外であればどのような文字シーケンスでもかまいません。 こうした特殊文字が必要であれば、単一引用符で囲みます(アンパサンド=> '&'など)。 ただし、引用符で囲まれていない空白文字は無視されるので注意してください。たとえば、b cbcとして処理されます。
  • 修飾子: 現在は、特別な照合ルールをオンにする修飾子が2つあります。
    • '@' : フランス語のように、アクセント(第2相違)の逆方向のソートをオンにする。
    • '!' : タイ語/ラオ語の母音と子音のスワップをオンにする。 タイ語の母音\U0E40-\U0E44が子音\U0E01-\U0E2Eに先行する、またはラオ語の母音\U0EC0-\U0EC4が子音\U0E81-\U0EAEに先行する場合にこのルールが適用されると、照合のために母音は子音のあとに配置される。

    '@' : アクセントがフランス語のように逆方向にソートされることを示します。

  • 関係文字: 関係文字には次のものがあります。
    • '<' : より大きい、文字相違の場合(第1)
    • ';' : より大きい、アクセント相違の場合(第2)
    • ',' : より大きい、ケース(大文字と小文字)相違の場合(第3)
    • '=' : 等しい
  • リセット文字: 主に短縮と拡張のために使用しますが、ルール・セットの終わりに修正を追加するためにも使用できるリセットが文字1つあります。

    '&': 次のルールが、リセット・テキスト引数がソートされる位置に続くことを示します。

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

 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」)に拡張されたかのようにソートされます。 この違いは、自然言語に見られます。 in traditional Spanish "ch" is treated as though it contracts to a single character (expressed as "c < ch < d"), while in traditional German a-umlaut is treated as though it expanded to two characters (expressed as "a,A < b,B ... &ae;\u00e3&AE;\u00c3").u00e3および\u00c3はaウムラウトのエスケープ・シーケンスです。

無視可能な文字

無視可能な文字の場合、最初のルールは、関係文字で始まる必要があります(上の例は実際には一部を表している。つまり、「a < b」は実際には「< a < b」であるべき)。 しかし、最初の関係文字が「<」でなければ、最初の「<」までのすべてのテキスト引数は無視できます。 たとえば、「, - < a < b」では「-」が無視できる文字です。これは、前に「black-birds」という語で見たとおりです。 ほかの言語の例を見れば、ほとんどのアクセントが無視できることがわかります。

正規化とアクセント

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

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

エラー

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

  • テキスト引数に引用符で囲まれていない句読文字がある(「a < b-c < d」など)。
  • 関係文字やリセット文字のあとにテキスト引数がない(「a < ,b」など)。
  • テキスト引数(またはテキスト引数の最初の部分文字列)がシーケンスにまだないのにリセット文字がある。(「a < b & e < f」など)
これらのエラーのうちどれかがあると、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 < \u00E6,\u00C6 < \u00F8,\u00D8 < \u00E5 = a\u030A,\u00C5 = A\u030A; aa, AA"

ニーズに合わせた特殊なルールを持つRuleBasedCollatorオブジェクトを作成するには、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" +
                    "< \u00E6, \u00C6" +     // Latin letter ae & AE
                    "< \u00F8, \u00D8" +     // Latin letter o & O with stroke
                    "< \u00E5 = a\u030A," +  // Latin letter a with ring above
                    "  \u00C5 = A\u030A;" +  // Latin letter A with ring above
                    "  aa, AA";
 RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
 

ルール文字列を連結して新しい照合ルール文字列を作成できます。 たとえば、getRules()から返されたルールを連結して、複数のRuleBasedCollatorを組み合わせることができます。

次の例は、非スペーシング・アクセントの順序を変更する方法を示しています。

 // 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);
 

導入されたバージョン:
1.1
関連項目:
CollatorCollationElementIterator
  • コンストラクタの詳細

    • RuleBasedCollator

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

    • getRules

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

      public CollationElementIterator getCollationElementIterator​(String source)
      指定されたStringのCollationElementIteratorを返します。
      パラメータ:
      source - 照合される文字列
      戻り値:
      CollationElementIteratorオブジェクト
      関連項目:
      CollationElementIterator
    • getCollationElementIterator

      public CollationElementIterator getCollationElementIterator​(CharacterIterator source)
      指定されたCharacterIteratorのCollationElementIteratorを返します。
      パラメータ:
      source - 照合される文字イテレータ
      戻り値:
      CollationElementIteratorオブジェクト
      導入されたバージョン:
      1.2
      関連項目:
      CollationElementIterator
    • compare

      public int compare​(String source, String target)
      2つの異なる文字列に格納された文字データを、照合ルールに従って比較します。 ある言語において、ある文字列が、別の文字列より大きいか、小さいか、または等しいかを返します。 これは、サブクラス内で上書きできます。
      定義:
      compare、クラス: Collator
      パラメータ:
      source - ソース文字列。
      target - ターゲット文字列。
      戻り値:
      整数値。 ソースがターゲットより小さければ、値はゼロより小さい。ソースがターゲットと等しければ、値はゼロ。ソースがターゲットより大きければ、値はゼロより大きい。
      例外:
      NullPointerException - sourceまたはtargetがnullの場合。
      関連項目:
      CollationKeyCollator.getCollationKey(java.lang.String)
    • getCollationKey

      public CollationKey getCollationKey​(String source)
      文字列を、CollationKey.compareToで比較できる一連の文字に変換します。 これは、java.text.Collator.getCollationKeyをオーバーライドします。 サブクラス内でオーバーライドできます。
      定義:
      getCollationKey、クラス: Collator
      パラメータ:
      source - 照合キーに変換する文字列。
      戻り値:
      Collatorの照合ルールに基づく、指定されたStringに対するCollationKey。 ソースStringがnullの場合はnullのCollationKeyが返される。
      関連項目:
      CollationKeyCollator.compare(java.lang.String, java.lang.String)
    • clone

      public Object clone()
      標準オーバーライドです。セマンティックスは変わりません。
      オーバーライド:
      clone、クラス: Collator
      戻り値:
      このインスタンスの複製。
      関連項目:
      Cloneable
    • equals

      public boolean equals​(Object obj)
      2つの照合オブジェクトが等しいかどうかを比較します。
      定義:
      equals、インタフェース: Comparator<Object>
      オーバーライド:
      equals、クラス: Collator
      パラメータ:
      obj - 比較対象のテーブル・ベースの照合オブジェクト。
      戻り値:
      現在のテーブル・ベースの照合オブジェクトが、テーブル・ベースの照合オブジェクトobjに等しい場合はtrue、そうでない場合はfalse。
      関連項目:
      Object.hashCode()HashMap
    • hashCode

      public int hashCode()
      テーブル・ベース照合オブジェクトのハッシュ・コードを生成します。
      定義:
      hashCode、クラス: Collator
      戻り値:
      このオブジェクトのハッシュ・コード値。
      関連項目:
      Object.equals(java.lang.Object), System.identityHashCode(java.lang.Object)