模块 java.base
 java.text

类 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] ).如果需要这些字符,您可以将它们放在单引号中(例如 & 符号 => '&')。请注意,忽略不带引号的空白字符;例如 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 当然是变音符号的转义序列。]

Ignorable Characters

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

Normalization and Accents

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

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

Errors

以下是错误:

  • 文本参数包含未加引号的标点符号(例如“a < bc < d”)。
  • 后面没有文本参数的关系或重置字符(例如“a < ,b”)。
  • 文本参数(或文本参数的初始子字符串)不在序列中的重置。 (例如“a < b & e < f”)
如果您产生这些错误之一,RuleBasedCollator 将抛出 ParseException

Examples

简单:“< 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 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
参见:
  • 构造方法详细信息

    • RuleBasedCollator

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

    • 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 - 目标字符串。
      返回:
      返回一个整数值。如果源小于目标,则值小于零;如果源和目标相等,则值为零;如果源大于目标,则值大于零。
      抛出:
      NullPointerException - 如果 sourcetarget 为空。
      参见:
    • getCollationKey

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

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

      public boolean equals(Object  obj)
      比较两个排序规则对象的相等性。
      指定者:
      equals 在接口 Comparator<Object>
      重写:
      equals 在类 Collator
      参数:
      obj - 要与之比较的基于表的排序规则对象。
      返回:
      如果当前基于表的排序规则对象与基于表的排序规则对象 obj 相同,则为真;否则为假。
      参见:
    • hashCode

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