所有类


java.text
类 RuleBasedCollator

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

public class RuleBasedCollator
   
   
   
   
   
extends Collator

RuleBasedCollator 类是 Collator 的具体子类,它提供了一个简单的、数据驱动的表 collator。可以通过此类来创建基于表的自定义 CollatorRuleBasedCollator 将字符映射到排序键。

为了提高效率,对 RuleBasedCollator 做了如下限制(其他子类可以用于更复杂的语言):

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

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

    <modifier>
    <relation> <text-argument>
    <reset> <text-argument>
 
规则元素的定义如下:
  • 文本参数:文本参数可以是任何的字符序列,不包括特殊字符(即公共空白字符 [0009-000D、0020] 和规则语法字符 [0021-002F、003A-0040、005B-0060、007B-007E])。如果需要使用这些字符,可以把它们放在单引号内(例如 & => '&')。注意,没有使用引号的空白字符将被忽略;例如 b c 视为 bc
  • 修饰符:目前有两个修饰符用于开启特殊的整理规则。
    • '@' : 开启重音字符的反向排序(二级区别),以法语为例。
    • '!' : 开启 Thai/Lao 元音-辅音字母交换。如果当 \U0E40-\U0E44 范围内的 Thai 元音字母排在 \U0E01-\U0E2E 范围内的 Thai 辅音字母前面,或者 \U0EC0-\U0EC4 范围内的 Lao 元音字母排在 \U0E81-\U0EAE 范围内的 Lao 辅音字母前面时此规则有效,那么经过整理后元音字母将被放置在辅音字母的后面。

    '@' : 指示重音字符按反向排序,以法语为例。

  • 关系:关系如下:
    • '<' : 大于,当字母不同时(一级)
    • ';' : 大于,当重音不同时(二级)
    • ',' : 大于,当大小写不同时(三级)
    • '=' : 等于
  • 重置:存在单一的重置主要用于规则集的缩减和扩充,但它也可以用于在规则集的末尾添加修改。

    '&' : 指示下一条规则在重置文本参数将要被排序的位置后面。

实际的操作要比看起来简单。例如,以下表达是等效的:

 a < b < c
 a < b & b < c
 a < c & a < b
 
注意,顺序很重要,因为后续项直接跟在文本参数的后面。以下是不等效的:
 a < b & a < c
 a < c & a < b
 
序列中必须存在文本参数,或者存在某个文本参数的初始子字符串。(例如,"a < b & ae < e" 是有效的,因为在 "ae" 被重置之前 "a" 存在)。在后一种情况中,"ae" 不是作为单个字符进行输入和处理的;相反,"e" 被排序,其结果类似于它被扩充为两个字符:"a" 后跟 "e"。此差别会出现在不同的自然语言中:在传统的西班牙语中,"ch" 被处理的结果类似于将它缩短为一个字符(表示为 "c < ch < d"),而在传统的德语中,a-umlaut 被处理的结果类似于将它扩充为两个字符(表示为 "a,A < b,B ...&ae;&AE;")。&ae;\u00e3&AE;\u00c3").当然,[\u00e3 和 \u00c3 是 a-umlaut 的转义序列。]

可忽略的字符

对于可忽略的字符,第一个规则必须从一个关系开始(以上例子实际上是不完整的;"a < b" 实际上应该为 "< a < b")。但是,如果第一个关系不是 "<",那么所有文本参数一直到第一个 "<" 都将被忽略。例如,", - < a < b" 将把 "-" 作为被忽略的字符,正如在前面的单词 "black-birds" 中所看到的。在不同语言的示例中,可以看到大多数重音字符被忽略。

规范化和重音

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

即使 collator 被设置为 NO_DECOMPOSITION,这也允许使用 RuleBasedCollator 来比较重音字符串。但是有两点警告:首先,如果要整理的字符串包含不规范顺序的组合序列,那么应该把 collator 设置为 CANONICAL_DECOMPOSITION 或 FULL_DECOMPOSITION 以启用组合序列的排序。其次,如果字符串包含兼容性分解的字符(例如全角和半角形式),那么必须使用 FULL_DECOMPOSITION,因为规则表只包括规范的映射。

错误

以下为错误:

  • 文本参数包含未使用引号的标点符号(例如"a < b-c < d")。
  • 关系或重置字符后面没有文本参数(例如 "a < ,b")。
  • 文本参数(或者文本参数的初始子字符串)不在序列中的重置。(例如 "a < b & e < f")
如果发生这些错误,RuleBasedCollator 将抛出 ParseException

以下是例子

Simple: "< 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 < \u00E5=a\u030A,\u00C5=A\u030A ;aa,AA< \u00E6,\u00C6< \u00F8,\u00D8"

通常,为了创建基于规则的 Collator 对象,必须使用 Collator 的工厂方法 getInstance。但是,为了创建基于规则的 Collator 对象,使此对象具有特殊的规则以满足需要,应该根据 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" +
                 "< \u00E5=a\u030A,\u00C5=A\u030A" +
                 ";aa,AA< \u00E6,\u00C6< \u00F8,\u00D8";
 RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
 

组合 Collator 就像连接字符串一样简单。以下是组合两个不同语言环境的 Collator 的一个例子:

 // Create an en_US Collator object
 RuleBasedCollator en_USCollator = (RuleBasedCollator)
     Collator.getInstance(new Locale("en", "US", ""));
 // Create a da_DK Collator object
 RuleBasedCollator da_DKCollator = (RuleBasedCollator)
     Collator.getInstance(new Locale("da", "DK", ""));
 // Combine the two
 // First, get the collation rules from en_USCollator
 String en_USRules = en_USCollator.getRules();
 // Second, get the collation rules from da_DKCollator
 String da_DKRules = da_DKCollator.getRules();
 RuleBasedCollator newCollator =
     new RuleBasedCollator(en_USRules + da_DKRules);
 // newCollator has the combined rules
 

另一个更有趣的例子是对现有表进行修改,以创建一个新的 Collator 对象。例如,将 "&C< ch, cH, Ch, CH" 添加到 en_USCollator 对象来创建自己的对象:

 // Create a new Collator object with additional rules
 String addRules = "&C< ch, cH, Ch, CH";
 RuleBasedCollator myCollator =
     new RuleBasedCollator(en_USCollator + addRules);
 // myCollator contains the new rules
 

以下例子演示了如何改变无空格重音字符的顺序。

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

最后一个例子显示了如何将新的主排序放在默认设置之前。例如,在日语 Collator 中,可以将英语字符排在日语字符的前面或后面。

 // get en_US Collator rules
 RuleBasedCollator en_USCollator = (RuleBasedCollator)Collator.getInstance(Locale.US);
 // add a few Japanese character to sort before English characters
 // suppose the last character before the first base letter 'a' in
 // the English collation rule is \u2212
 String jaString = "& \u2212 < \u3041, \u3042 < \u3043, \u3044";
 RuleBasedCollator myJapaneseCollator = new
     RuleBasedCollator(en_USCollator.getRules() + jaString);
 

另请参见:
Collator, CollationElementIterator

字段摘要
 
从类 java.text.Collator 继承的字段
CANONICAL_DECOMPOSITION, FULL_DECOMPOSITION, IDENTICAL, NO_DECOMPOSITION, PRIMARY, SECONDARY, TERTIARY
 
构造方法摘要
RuleBasedCollator(String rules)
          RuleBasedCollator 构造方法。
 
方法摘要
 Object clone()
          标准重写,无语义变化。
 int compare(String source, String target)
          根据表规则比较存储在两个不同字符串中的字符数据。
 boolean equals(Object obj)
          比较两个 collation 对象的相等性。
 CollationElementIterator getCollationElementIterator(CharacterIterator source)
          返回给定 String 的 CollationElementIterator。
 CollationElementIterator getCollationElementIterator(String source)
          返回给定 String 的 CollationElementIterator。
 CollationKey getCollationKey(String source)
          将字符串转换为能够与 CollationKey.compareTo 进行比较的一系列字符。
 String getRules()
          获取 collation 对象的基于表的规则。
 int hashCode()
          生成基于表的 collation 对象的哈希码
 
从类 java.text.Collator 继承的方法
compare, equals, getAvailableLocales, getDecomposition, getInstance, getInstance, getStrength, setDecomposition, setStrength
 
从类 java.lang.Object 继承的方法
finalize, getClass, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

RuleBasedCollator

public RuleBasedCollator(String rules)
                  throws ParseException
RuleBasedCollator 构造方法。它采用表规则并生成一个整理表。有关整理规则语法的更多信息,请参阅 RuleBasedCollator 类描述。

参数:
rules - 用来生成整理表的整理规则。
抛出:
ParseException - 如果规则的生成进程失败,则抛出一个格式异常。例如,生成规则 "a < ?< d" 将导致构造方法抛出 ParseException,因为 '?' 没有使用引号。
另请参见:
Locale
方法详细信息

getRules

public String getRules()
获取 collation 对象的基于表的规则。

返回:
返回创建表 collation 对象的整理规则。

getCollationElementIterator

public CollationElementIterator getCollationElementIterator(String source)
返回给定 String 的 CollationElementIterator。

另请参见:
CollationElementIterator

getCollationElementIterator

public CollationElementIterator getCollationElementIterator(CharacterIterator source)
返回给定 String 的 CollationElementIterator。

从以下版本开始:
1.2
另请参见:
CollationElementIterator

compare

public int compare(String source,
                   String target)
根据表规则比较存储在两个不同字符串中的字符数据。返回关于一个字符串小于、大于或等于另一个字符串的信息。在子类中这可以被重写。

指定者:
Collator 中的 compare
参数:
source - 源字符串。
target - 目标字符串。
返回:
返回一个整数值。如果源小于目标,则该值小于零;如果源等于目标,则该值为零;如果源大于目标,则该值大于零。
另请参见:
CollationKey, Collator.getCollationKey(java.lang.String)

getCollationKey

public CollationKey getCollationKey(String source)
将字符串转换为能够与 CollationKey.compareTo 进行比较的一系列字符。这将重写 java.text.Collator.getCollationKey。在子类中它可以被重写。

指定者:
Collator 中的 getCollationKey
参数:
source - 将要被转换为整理键的字符串。
返回:
根据此 Collator 的整理规则为给定 String 创建的 CollationKey。如果源 String 为 null,则返回一个 null CollationKey。
另请参见:
CollationKey, Collator.compare(java.lang.String, java.lang.String)

clone

public Object clone()
标准重写,无语义变化。

覆盖:
Collator 中的 clone
返回:
此实例的一个克隆。
另请参见:
Cloneable

equals

public boolean equals(Object obj)
比较两个 collation 对象的相等性。

指定者:
接口 Comparator<Object> 中的 equals
覆盖:
Collator 中的 equals
参数:
obj - 要与此对象进行比较的基于表的 collation 对象。
返回:
如果当前的基于表的 collation 对象与基于表的 collation 对象 obj 相同,则返回 true;否则返回 false。
另请参见:
Object.hashCode(), Hashtable

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部