排序
java中的compareTo方法是用Unicode字符来决定顺序的。对于特定语言的专属字符,Unicode值可能特别大,我们可以使用以下方法来改善排序效果
1 | Locale loc=...; |
Collator类实现了Comparator接口,它的排序方法照顾到了语言特性。同时,我们还可以传一个排序器对象到Collection.sort方法中来对一组字符串进行排序
1 | Collections.sort(strings.coll); |
排序强度
1)字符间的差别: 分为首要的、其次的、和再次的;如, A 和 Z 之间的差别被归为首要的, 而 A 和 A(头顶小圆圈)的差别是其次的, 而A 和 a 是再次的;
2)排序强度设置:
- 2.1)如果将强度设为 Collator.PRIMARY:那么排序器将只关注 primary级的差别;
- 2.2) 如果将强度设为 Collator.SECONDARY: 那么排序器将关注 primary + secondary 级的差别, 也就是说,两个字符串在“secondary”或“tertiary”强度下很容易被区分开;
- 2.3) 如果将强度设为 Collator.IDENTICAL:则不允许有任何差异;这种设置在与排序器的第二种具有相当技术性的设置,即分解模式,联合使用时,就会显得特别有用;
排序器分解模式
1)分解: 即一个字符对应多个Unicode编码;如A(头顶一个圆圈)可以是Unicode字符 U+00C5, 或者表示为 普通的A(U+0065)后跟一个圆圈;
2)Unicode标准: 对字符串定义了四种范化形式: D, KD, C 和 KC;
3)我们可以选择排序器所使用的范化程度(如下表所示):
- 3.1)NO_DECOMPOSITION(不分解): Collator.NO_DECOMPOSITION 表示不对字符串做任何范化,这时选项处理速度较快, 但是对于以多种形式表示字符的文本就显得不适用了;
- 3.2)CANONICAL_DECOMPOSITION(规范分解): 默认值Collator.CANONICAL_DECOMPOSITION 使用 范化形式D, 这对于包含重音但不包含连字的文本是非常有用的形式;
- 3.3)完全分解: 最后是使用 范化形式KD的完全分解;
4)让排序器去多次分解一个字符串是很浪费时间的: getCollationKey方法: 返回一个 CollationKey对象, 可以用它来进行更深入的,更快速的比较操作,下面是一个荔枝: (干货——让排序器去多次分解一个字符串是很浪费时间的,故而引入了 getCollationKey方法, CollationKey==排序键)
1 | String a = …; |
5)最后,有可能在你不需要进行排序时, 也希望将字符串转换为它们的范化形式。java.text.Normalizer 类实现了 对范化的处理, 如:
1 | String name = “augs”; |
6)看个荔枝(为排序器设置排序强度和为排序器设置分解模式):
1 | public static void main(String[] args) |
compare是大序在前