专栏首页码字搬砖初步认识Collator

初步认识Collator

1.Collator是什么? 主要是用来对区域敏感性的字符串比较的,对本地化字符串进行排序。 什么是区域敏感性字符串呢?比如中文,比如 ß,在德语中,你可能希望 ß (\u00DF) 被当作 b 或者 B 来进行排序,但事实上在该语言中 ß 的排序值高于正常的 s。再比如比较 “a”, “à”。

2.为什么使用 Collator? 类Collator用于对语言敏感的排序问题,并不会只基于它们的ASCII/Unicode字符去尝试排序。使用Collator要求你在完全应用它的特性之前要理解一个额外的属性,即称之为强度(Strength)的属性。Collator的强度设置决定了在排序时如何使用强(或弱)匹配。

该属性有4个可能的值:PRIMARY,SECONDARY,TERTIARY和IDENTICAL。具体是哪个强度在产生作用取决于语言环境。 典型地,会有如下的情况。按从后往前的顺序,IDENTICAL强度表示能够被进行相同的处理的字符必须是一致的。TERTIARY通常用于忽略大小写差异。SECONDARY用于忽略变音符,如n和ñ。 PRIMARY与IDENTICAL相似也是基于字母之间差异,但是当处理控制字符和发音时还是有所不同。

3.排序样例

#中文排序
 ArrayList<String> list = new ArrayList<String>();
    list.add("一鸣惊人-Y");
    list.add("人山人海-R");
    list.add("海阔天空-H");
    list.add("空前绝后-K");
    list.add("后来居上-H");
    
    Comparator<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
    
    Collections.sort(list, cmp);
    for (String str : list) {
        System.out.println(str);
    }
/*
    更深层次的原因是Java使用的是UNICODE编码,而中文UNICODE字符集是源于GB18030的,GB18030又是从GB2312发展起来的,GB2312是一个包含了7000多个字符的字符集,它是按照拼音排序,并且是连续的.
之后的GBK,GB18030都是在其基础上扩充起来的.
如果是排序对象是经常使用的汉字,使用Collator类排序完全可以满足我们的需求.毕竟GB2312已经包含了大部分的汉字,如果需要严格排序,则要使用一些开源项目来自己实现了.
*/

4.其他正常的排序方式

#数字排序
List<Integer> list = new ArrayList<Integer>();
    // 插入元素
    list.add(2);
    list.add(0);
    list.add(3);
    list.add(4);
    list.add(1);
    Collections.sort(list);
    for (int i : list) {
        System.out.println(i);
    }

#实体类排序
public class TextList {
    public static void main(String[] args) {
        List<User> userlist = new ArrayList<User>();
        userlist.add(new User("Y - 易小星 ", 33));
        userlist.add(new User("W - 王大锤", 33));
        Comparator<User> cmp = new ComparatorUser();
        Collections.sort(userlist, cmp);
        for (User user : userlist) {
            System.out.println(user.getName());
        }
    }
}
class ComparatorUser implements Comparator<User> {
    @Override
    public int compare(User u1, User u2) {
        // 先按年龄排序
        int flag = u1.getAge().compareTo(u2.getAge());
        // 年龄相等比较姓名
        if (flag == 0) {
            return u1.getName().compareTo(u2.getName());
        } else {
            return flag;
        }
    }
}
class User {
    private String name;
    private Integer age;
    public User() {
        super();
    }
    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于Iterator和Iterable

    shengjk1
  • 排序算法总括-java版

    内部排序就是仅仅依赖于内存就可以进行的排序,比如有交换排序、插入排序、选择排序、归并排序、基数排序

    shengjk1
  • Flink Context到底是什么?

    Context ,又称执行上下文,特别抽象的一个东西,今天特地记录一下 Flink Context 到底是什么?有什么作用?不至于每天使用 Flink,总感觉云...

    shengjk1
  • 对list中的对象属性排序

    而Arrays.sort使用的是冒泡和归并排序,默认是归并排序,所以排序速度还是很快的.

    IT小马哥
  • 线程间的通信方式,JAVA程序员必须会!

    本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码。

    用户5224393
  • python内置常用高阶函数(列出了5个

    引用自:http://www.cnblogs.com/duyaya/p/8562898.html

    py3study
  • Python高阶函数

    在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在 python 中一切皆对象,函数也不例外。比如求绝对值函数 abs,我们可以用一个变量 f 指向 a...

    Python编程与实战
  • Java|使用WebMagic进行电话爬取

    WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,可以快速开发出一个高效、易维护的爬虫,原生开发方式核心很简单,功能性给简单性让步。可以通...

    算法与编程之美
  • 测试面试题集-Python编程题(1)

    使用while循环实现输出2 - 3 + 4 - 5 + 6 ... + 100 的和。

    ITester软件测试小栈
  • 设计模式入门:抽象工厂模式

      抽象工厂用于提供创建一系列相关或互相依赖的接口,而无需指定它们具体的类。对比工厂方法,抽象工厂面对的是整个产品族,而工厂方法面对的是独立的产品。

    happyJared

扫码关注云+社区

领取腾讯云代金券