java.lang.Object java.text.Collator java.text.RuleBasedCollator
public class RuleBasedCollator
RuleBasedCollator
类是 Collator
的具体子类,它提供了一个简单的、数据驱动的表 collator。可以通过此类来创建基于表的自定义 Collator
。RuleBasedCollator
将字符映射到排序键。
为了提高效率,对 RuleBasedCollator
做了如下限制(其他子类可以用于更复杂的语言):
整理表由一组整理规则组成,其中每个规则是以下三种形式之一:
<modifier> <relation> <text-argument> <reset> <text-argument>规则元素的定义如下:
b c
视为 bc
。 '@' : 指示重音字符按逆向排序,以法语为例。
'&' : 指示下一条规则在重置文本参数将要被排序的位置后面。
实际的操作要比看起来简单。例如,以下表达是等效的:
注意,顺序很重要,因为后续项直接跟在文本参数的后面。以下是不等效的: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,因为规则表只包括规范的映射。
错误
以下为错误:
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"
要创建 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" + "< \u00E5=a\u030A,\u00C5=A\u030A" + ";aa,AA< \u00E6,\u00C6< \u00F8,\u00D8"; RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
可以通过连接规则字符串来创建新的整理字符串。例如,可以连接由 getRules()
返回的规则,以联合多个 RuleBasedCollator
。
以下例子演示了如何改变无空格重音字符的顺序。
// 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
,
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 |
构造方法详细信息 |
---|
public RuleBasedCollator(String rules) throws ParseException
rules
- 用来生成整理表的整理规则。
ParseException
- 如果规则的生成进程失败,则抛出一个格式异常。例如,生成规则 "a < ?< d" 将导致构造方法抛出 ParseException,因为 '?' 没有使用引号。
Locale
方法详细信息 |
---|
public String getRules()
public CollationElementIterator getCollationElementIterator(String source)
CollationElementIterator
public CollationElementIterator getCollationElementIterator(CharacterIterator source)
CollationElementIterator
public int compare(String source, String target)
source
- 源字符串。
target
- 目标字符串。
CollationKey
,
Collator.getCollationKey(java.lang.String)
public CollationKey getCollationKey(String source)
Collator
中的
getCollationKey
source
- 将要被转换为整理键的字符串。
CollationKey
,
Collator.compare(java.lang.String, java.lang.String)
public Object clone()
public boolean equals(Object obj)
Comparator<Object>
中的
equals
Collator
中的
equals
obj
- 要与此对象进行比较的基于表的 collation 对象。
Object.hashCode()
,
Hashtable
public int hashCode()
Object.equals(java.lang.Object)
,
Hashtable