Module java.base
Package java.text

Class RuleBasedCollator

java.lang.Object
java.text.Collator
java.text.RuleBasedCollator
所有已实现的接口:
Cloneable, Comparator<Object>

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

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

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

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

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

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

  • Relation: 关系如下:
    • '<':大于,作为字母差异(主要)
    • ';':大于,作为重音差异(次要)
    • ',':大于,作为大小写差异(三级)
    • '=':相等
  • Reset: 有一个单一的重置,主要用于缩略词和扩展,但也可用于在一组规则的末尾添加修改。

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

 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”不会被输入和视为单个字符;相反,“e”将被排序,就好像它被扩展为两个字符:“a”后跟一个“e”。这种差异在自然语言中出现:在传统的西班牙语中,“ch”被视为缩为一个字符(表示为“c < ch < d”),而在传统的德语中,a-umlaut被视为扩展为两个字符(表示为“a,A < b,B ... &ae;\u00e3&AE;\u00c3”)。 [\u00e3和\u00c3当然是a-umlaut的转义序列。]

可忽略的字符

规范化和重音

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

RuleBasedCollator比较带重音的字符串,即使排序器设置为NO_DECOMPOSITION。但是,有两个注意事项。首先,如果要排序的字符串包含可能不按照规范顺序的组合序列,则应将排序器设置为CANONICAL_DECOMPOSITION或FULL_DECOMPOSITION以启用组合序列的排序。其次,如果字符串包含具有兼容分解(例如全角和半角形式)的字符,则必须使用FULL_DECOMPOSITION,因为规则表仅包含规范映射。

错误

  • 文本参数包含未引用的标点符号(例如,“a < b-c < 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, 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” + // 拉丁字母ae & AE “< \u00F8, \u00D8” + // 拉丁字母o & O带划线 “< \u00E5 = a\u030A,” + // 拉丁字母带上环的a “ \u00C5 = A\u030A;” + // 拉丁字母带上环的A “ 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” +
                    “< 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” +     // 拉丁字母ae & AE
                    “< \u00F8, \u00D8” +     // 拉丁字母o & O带划线
                    “< \u00E5 = a\u030A,” +  // 拉丁字母带上环的a
                    “  \u00C5 = A\u030A;” +  // 拉丁字母带上环的A
                    “  aa, AA”;
 RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
 
getRules()返回的规则可以连接以组合多个 RuleBasedCollator

 // 旧规则
 String oldRules = “=\u0301;\u0300;\u0302;\u0308”    // 主要重音
                 + “;\u0327;\u0303;\u0304;\u0305”    // 主要重音
                 + “;\u0306;\u0307;\u0309;\u030A”    // 主要重音
                 + “;\u030B;\u030C;\u030D;\u030E”    // 主要重音
                 + “;\u030F;\u0310;\u0311;\u0312”    // 主要重音
                 + “< a , A ; ae, AE ; \u00e6 , \u00c6”
                 + “< b , B < c, C < e, E & C < d, D”;
 // 更改重音字符的顺序
 String addOn = “& \u0300 ; \u0308 ; \u0302”;
 RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn);
 
自版本:
1.1
参见:
  • Constructor Details

    • RuleBasedCollator

      public RuleBasedCollator(String rules) throws ParseException
      RuleBasedCollator构造函数。这将使用表规则构建排序表。有关排序规则语法的更多详细信息,请参阅RuleBasedCollator类描述。
      参数:
      rules - 从中构建排序表的排序规则。
      抛出:
      ParseException - 如果规则构建过程失败,将抛出格式异常。例如,构建规则“a < ? < d”将导致构造函数抛出ParseException,因为“?”未被引用。
      参见:
  • Method Details

    • getRules

      public String getRules()
      获取排序对象的基于表的规则。
      返回:
      返回创建表排序对象的排序规则。
    • getCollationElementIterator

      public CollationElementIterator getCollationElementIterator(String source)
      返回给定字符串的CollationElementIterator。
      参数:
      source - 要排序的字符串
      返回:
      一个CollationElementIterator对象
      参见:
    • getCollationElementIterator

      public CollationElementIterator getCollationElementIterator(CharacterIterator source)
      返回给定CharacterIterator的CollationElementIterator。
      参数:
      source - 要进行排序的字符迭代器
      返回:
      一个 CollationElementIterator 对象
      自:
      1.2
      参见:
    • compare

      public int compare(String source, String target)
      根据排序规则比较两个不同字符串中存储的字符数据。返回关于一个字符串在语言中是小于、大于还是等于另一个字符串的信息。这可以在子类中被重写。
      指定者:
      compare 在类 Collator
      参数:
      source - 源字符串。
      target - 目标字符串。
      返回:
      返回一个整数值。如果 source 小于 target,则值小于零,如果 source 和 target 相等,则值为零,如果 source 大于 target,则值大于零。
      抛出:
      NullPointerException - 如果 sourcetarget 为 null。
      参见:
    • getCollationKey

      public CollationKey getCollationKey(String source)
      将字符串转换为一系列字符,可以与 CollationKey.compareTo 进行比较。这会覆盖 java.text.Collator.getCollationKey。可以在子类中被重写。
      指定者:
      getCollationKey 在类 Collator
      参数:
      source - 要转换为排序键的字符串。
      返回:
      基于此 Collator 的排序规则为给定字符串生成的 CollationKey。如果源字符串为 null,则返回 null CollationKey。
      参见:
    • clone

      public Object clone()
      标准覆盖;语义无变化。
      覆盖:
      clone 在类 Collator
      返回:
      此实例的克隆。
      参见:
    • equals

      public boolean equals(Object obj)
      比较两个排序对象的相等性。
      指定者:
      equals 在接口 Comparator<Object>
      覆盖:
      equals 在类 Collator
      参数:
      obj - 要与此进行比较的基于表的排序对象。
      返回:
      如果当前基于表的排序对象与基于表的排序对象 obj 相同,则返回 true;否则返回 false。
      参见:
    • hashCode

      public int hashCode()
      为基于表的排序对象生成哈希码。
      指定者:
      hashCode 在类 Collator
      返回:
      此对象的哈希码值。
      参见: