|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.text
类 RuleBasedCollator
java.lang.Object java.text.Collator java.text.RuleBasedCollator
- 所有已实现的接口:
- Cloneable, Comparator<Object>
-
public class RuleBasedCollator
- extends Collator
RuleBasedCollator
类是 Collator
的具体子类,它提供了一个简单的、数据驱动的表 collator。可以通过此类来创建基于表的自定义 Collator
。RuleBasedCollator
将字符映射到排序键。
为了提高效率,对 RuleBasedCollator
做了如下限制(其他子类可以用于更复杂的语言):
- 如果指定了由 <modifier> 控制的特殊整理规则,则它将用于整个 collator 对象。
- 所有未指定的字符位于整理顺序的末尾。
整理表由一组整理规则组成,其中每个规则是以下三种形式之一:
<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 & 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 < c a < c & a < b
可忽略的字符
对于可忽略的字符,第一个规则必须从一个关系开始(以上例子实际上是不完整的;"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)
- 根据表规则比较存储在两个不同字符串中的字符数据。返回关于一个字符串小于、大于或等于另一个字符串的信息。在子类中这可以被重写。
-
- 参数:
-
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()
equals
public boolean equals(Object obj)
- 比较两个 collation 对象的相等性。
-
- 指定者:
-
接口
Comparator<Object>
中的equals
- 覆盖:
-
类
Collator
中的equals
-
- 参数:
-
obj
- 要与此对象进行比较的基于表的 collation 对象。 - 返回:
- 如果当前的基于表的 collation 对象与基于表的 collation 对象 obj 相同,则返回 true;否则返回 false。
- 另请参见:
-
Object.hashCode()
,Hashtable