Module  java.base
软件包  java.text

Class RuleBasedCollator

  • All Implemented Interfaces:
    CloneableComparator<Object>


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

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

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

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

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

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

    • 关系 :关系如下:
      • '<':大,作为信差(主)
      • ';' :大,作为重音差(次要)
      • ',':大于病例差异(大专)
      • '=':等于
    • 重置 :有一个单独的重置,主要用于收缩和扩展,但也可以用于在一组规则的末尾添加修改。

      '&':表示下一个规则遵循重置文本参数进行排序的位置。

    这听起来比实际上更复杂。 例如,以下是表达相同内容的等效方法:

     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”是有效的,因为在“ae”被重置之前的序列中存在“a”)。 在后一种情况下,“ae”不输入并视为单个字符; 相反,“e”按照扩展为两个字符进行排序:“a”后跟“e”。 这种差异出现在自然语言中:在传统的西班牙语“ch”被视为一个单一的字符(表示为“c <ch <d”),而在传统的德语a-umlaut被看作是扩展到两个字符(表示为“a,A <b,B ...&ae; \ u00e3&AE; \ u00c3”)。 [\ u00e3和\ u00c3当然是a-umlaut的转义序列。]

    不可思议的人物

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

    规范化和口音

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

    这使您可以使用RuleBasedCollator来比较重音字符串,即使将整理器设置为NO_DECOMPOSITION。 但是有两个注意事项。 首先,如果要整理的字符串包含可能不符合规范的组合序列,则应将归一化器设置为CANONICAL_DECOMPOSITION或FULL_DECOMPOSITION以启用对组合序列的排序。 第二,如果字符串包含具有兼容性分解的字符(例如全宽和半角形式),则必须使用FULL_DECOMPOSITION,因为规则表仅包括规范映射。

    错误

    以下是错误:

    • 文本参数包含未引用的标点符号(例如“a <bc <d”)。
    • 关系或重置字符不在文本参数后面(例如“a <,b”)。
    • 文本参数(或文本参数的初始子字符串)不在序列中的重置。 (例如“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 <m,M <n,N <o,O <p,P <q,Q <r,R <s,S <t,T <u,U <v,V <w,W <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 s。

    以下示例演示如何更改非间距重音符的顺序,

     // 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 - 目标字符串。
        结果
        返回一个整数值。 如果源小于目标值,则值小于零,如果源和目标相等,则值为零,如果源大于目标值,则值大于零。
        异常
        NullPointerException - 如果 sourcetarget为空。
        另请参见:
        CollationKeyCollator.getCollationKey(java.lang.String)
      • getCollationKey

        public CollationKey getCollationKey​(String source)
        将字符串转换成可以与CollationKey.compareTo进行比较的一系列字符。 这将覆盖java.text.Collator.getCollationKey。 它可以在一个子类中被覆盖。
        Specified by:
        getCollationKeyCollator
        参数
        source - 要转换为归类密钥的字符串。
        结果
        基于此Collator的排序规则的给定String的CollationKey。 如果源String为null,则返回一个空CollationKey。
        另请参见:
        CollationKeyCollator.compare(java.lang.String, java.lang.String)
      • clone

        public Object clone​()
        标准覆盖 语义不变。
        重写:
        cloneCollator
        结果
        这个实例的一个克隆。
        另请参见:
        Cloneable
      • equals

        public boolean equals​(Object obj)
        比较两个对照对象的相等性。
        Specified by:
        equals在接口 Comparator<Object>
        重写:
        equalsCollator
        参数
        obj - 要与之进行比较的基于表的归类对象。
        结果
        如果当前基于表的归类对象与基于表的归类对象obj相同,则为true; 否则为假。
        另请参见:
        Object.hashCode()HashMap