美文网首页
初步认识Collator

初步认识Collator

作者: shengjk1 | 来源:发表于2020-02-24 16:51 被阅读0次

    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:初步认识Collator

          本文链接:https://www.haomeiwen.com/subject/yycbqhtx.html