本地化OR普通---Java中的字符串比较,按照使用习惯进行比较

来源:互联网 发布:最小的阅读软件 编辑:程序博客网 时间:2024/06/07 11:30
        java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值。但是很多情况下,我们开发一款app需要结合“国情”,比如在电话本中,我们希望“李四”排在“zhangsan”的前面,但是如果采用普通的compareTo函数的字符串比较的方式,那么“zhangsan”小于“李四”,由此造成了“zhangsan”的排序先于“李四”。
 

CollationKey 表示遵守特定 Collator 对象规则的 String。比较两个 CollationKey 将返回它们所表示的 String 的相对顺序。使用 CollationKey 来比较 String 通常比使用 Collator.compare 更快。因此,当必须多次比较 String 时(例如,对一个 String 列表进行排序),使用 CollationKey 会更高效。

不能直接创建 CollationKey。而是通过调用 Collator.getCollationKey 来生成。只能比较同一个 Collator 对象生成的 CollationKey

为一个 String 生成 CollationKey 涉及到检查整个 String,并将它转换成可以按位比较的一系列位。一旦生成了键,就允许进行快速比较。当 String 需要多次比较时,以更快速的比较方式生成键的成本可以忽略不计。另一方面,比较的结果通常由每个 String 的第一对字符确定。Collator.compare 只检查实际需要比较的字符,当进行单次比较时,此比较方式更快。

解决方式是采用java提供的 Collator类。

        实例出一个常见的通讯录列表,其中包含正常的名称,还有一些非正常的英文+数字(这种情况是比较常见的):

public static List<String> init() {    List<String> list = new ArrayList<String>();    list.add("李方");    list.add("郭云2");    list.add("郭云3");    list.add("赵飞");    list.add("马路");    list.add("xxx");    list.add("xxy");    list.add("432");    return list;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

之后我们需要实例化 Collator,并获取当前语言环境,通过重写比较器 Comparator来调用 Collections.sort() 方法,代码如下:

public static void sort() {    List<String> list = init();    Comparator<String> comparator = new Comparator<String>() {        public int compare(String o1, String o2) {            Collator collator = Collator.getInstance();            return collator.getCollationKey(o1).compareTo(                collator.getCollationKey(o2));        }    };    Collections.sort(list, comparator);    System.out.println(list);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果如下:

[432, xxx, xxy, 郭云2, 郭云3, 李方, 马路, 赵飞]
  • 1
  • 2

数字排在最前,英文字母其次,汉字则按照拼音进行排序。