模块  java.base
软件包  java.text

Class RuleBasedCollator

  • 实现的所有接口
    CloneableComparator<Object>

    public class RuleBasedCollator
    extends Collator
    所述RuleBasedCollator类是的具体子类Collator ,提供了一个简单的,数据驱动的表collator。 使用此类,您可以创建基于表的自定义Collator RuleBasedCollator将字符映射到排序键。

    RuleBasedCollator对效率有以下限制(其他子类可用于更复杂的语言):

    1. 如果指定了由<modifier>控制的特殊排序规则,则它将应用于整个collator对象。
    2. 所有未提及的字符都在整理顺序的末尾。

    排序规则表由排序规则列表组成,其中每个规则是以下三种形式之一:

      <modifier>
        <relation> <text-argument>
        <reset> <text-argument> 
    规则要素的定义如下:
    • 文本参数 :文本参数是任何字符序列,不包括特殊字符(即常见的空白字符[0009-000D,0020]和规则语法字符[0021-002F,003A-0040,005B-0060,007B- 007E])。 如果需要这些字符,可以将它们放在单引号中(例如,ampersand =>'&')。 请注意,忽略不带引号的空格字符; 例如, b c被视为bc
    • 修饰符 :目前有两个修饰符可以打开特殊的归类规则。
      • '@':开启向后排序的重音(次要差异),如法语。
      • '!' :打开泰语/老挝元音 - 辅音交换。 如果此规则在范围\ U0E40- \ U0E44的泰语元音位于范围\ U0E01- \ U0E2E的泰语辅音之前有效,或者范围为\ U0EC0- \ U0EC4的老挝元音先于该范围的老挝辅音\ U0E81- \ U0EAE然后将元音放在辅音后面以进行整理。

      '@':表示重音按向后排序,如法语。

    • 关系 :关系如下:
      • '<':更大,作为字母差异(主要)
      • ';' :更大,作为重音差异(次要)
      • ',':更大,作为案例差异(第三级)
      • '=':平等
    • 重置 :有一次重置主要用于收缩和扩展,但也可用于在一组规则的末尾添加修改。

      '&':表示下一个规则遵循重置text-argument将被排序的位置。

    这听起来比在实践中更复杂。 例如,以下是表达同一事物的等效方式:

     a < b < c
     a < b & b < c
     a < c & a < b
     
    请注意,顺序很重要,因为后续项目紧跟在text-argument之后。 以下不相同:
     a < b & a < c
     a < c & a < b
     
    text-argument必须已经存在于序列中,或者text-argument的某些初始子字符串必须存在。 (例如,“a <b&ae <e”有效,因为“a”在重置“ae”之前的序列中存在“a”。 在后一种情况下,不输入“ae”并将其视为单个字符; 相反,“e”被排序,好像它被扩展为两个字符:“a”后跟“e”。 这种差异出现在自然语言中:在传统的西班牙语中,“ch”被视为收缩到单个字符(表示为“c <ch <d”),而在传统的德语中,a-umlaut被视为扩展为2字符(表示为“a,A <b,B ......&ae; \ u00e3&AE; \ u00c3”)。 [\ u00e3和\ u00c3当然是a-umlaut的转义序列。]

    可忽略的角色

    对于可忽略的字符,第一个规则必须以关系开头(我们上面使用的例子实际上是片段;“a <b”确实应该是“<a <b”)。 但是,如果第一个关系不是“<”,那么直到第一个“<”的所有文本参数都是可忽略的。 例如,“, - <a <b”使“ - ”成为一个可忽略的角色,正如我们之前在“黑鸟”一词中看到的那样。 在不同语言的示例中,您会看到大多数重音都是可忽略的。

    规范化和口音

    RuleBasedCollator自动处理其规则表以包括重音字符的预组合和组合字符版本。 即使提供的规则字符串仅包含基本字符和单独的组合重音字符,也会在表格中输入与规则字符串中所有字符的规范组合相匹配的预先组合的重音字符。

    这允许您使用RuleBasedCollator来比较重音字符串,即使将collator设置为NO_DECOMPOSITION也是如此。 然而,有两个警告。 首先,如果要整理的字符串包含可能不是规范顺序的组合序列,则应将collator设置为CANONICAL_DECOMPOSITION或FULL_DECOMPOSITION以启用组合序列的排序。 其次,如果字符串包含具有兼容性分解的字符(例如全宽和半宽形式),则必须使用FULL_DECOMPOSITION,因为规则表仅包括规范映射。

    错误

    以下是错误:

    • text-argument包含不带引号的标点符号(例如“a <bc <d”)。
    • 关系或重置字符后面没有文本参数(例如“a <,b”)。
    • text-argument(或text-argument的初始子字符串)不在序列中的重置。 (例如“a <b&e <f”)
    如果您产生其中一个错误,则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 <\ u00E6,\ u00C6 <\ u00F8,\ u00D8 <\ u00E5 = a \ u030A,\ u00C5 = A \ u030A; aa,AA“

    要创建一个RuleBasedCollator有适合您的需要的专门规则对象,在构造RuleBasedCollator与包含在规则String对象。 例如:

     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)
        根据整理规则比较存储在两个不同字符串中的字符数据。 返回有关字符串是否小于,大于或等于语言中另一个字符串的信息。 这可以在子类中重写。
        Specified by:
        compare在课程 Collator
        参数
        source - 源字符串。
        target - 目标字符串。
        结果
        返回一个整数值。 如果source小于target,则值小于零,如果source和target相等,则值为零,如果source大于target,则value大于零。
        异常
        NullPointerException - 如果 sourcetarget为空。
        另请参见:
        CollationKeyCollator.getCollationKey(java.lang.String)
      • getCollationKey

        public CollationKey getCollationKey​(String source)
        将字符串转换为一系列可与CollationKey.compareTo进行比较的字符。 这会覆盖java.text.Collator.getCollationKey。 它可以在子类中重写。
        Specified by:
        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)
        比较两个归类对象的相等性。
        Specified by:
        equals in interface Comparator<Object>
        重写:
        equals在课程 Collator
        参数
        obj - 要与此进行比较的基于表的排序规则对象。
        结果
        如果当前基于表的排序规则对象与基于表的排序规则对象obj相同,则为true;否则为false。 否则是假的。
        另请参见:
        Object.hashCode()HashMap