A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 大蓝鲸Java 中级黑马   /  2018-5-18 10:12  /  918 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        在我们学习过程中,有一个集合可以让我们排序,还可以用键值对的形式存储,这个集合就是TreeMap。
       特点:
        去重,存储顺序不一致,但是可以排序。排序规则可以是任意的。//升序。降序。字典顺序。自定义对象按照年龄排序。字符串按长度排序等
        "键排序"


1,TreeMap集合存储  String 和 Integer                                                        TreeMap集合存储  Integer 和 String
                TreeMap<String, Integer> tm = new TreeMap<>();                |                        TreeMap<Integer, String> tm = new TreeMap<>();
                        tm.put("aaa", 222);                                                                |                                tm.put(222, "aaa");
                        tm.put("bbb", 111);                                                        |                                tm.put(111, "bbb");
                        tm.put("ccc", 444);                                                                |                                tm.put(444, "ccc");
                        tm.put("ddd", 333);                                                        |                                tm.put(333, "ddd");
                        System.out.println(tm);                                                        |                                System.out.println(tm);
        //打印结果{aaa=222, bbb=111, ccc=444, ddd=333}                        |                //打印结果 {111=bbb, 222=aaa, 333=ddd, 444=ccc}               
                键去重,键排序。   字符串默认字典顺序                                        |                        键去重,键排序。   Integer默认升序
                                                                                                               

                       

TreeMap 保证顺序的原理:
                要指定一个顺序让 TreeMap 去按照这个顺序去排列
                "永远注意,是键排序,键去重,跟值无关"
                       
                TreeMap 是一个容器,只不过这个容器有一个特殊的作用,就是排序。
                                                        但是排序的时候我们需要制定一种顺序去排。
                                                        所以TreeMap集合我们只需要研究他是怎么排。
        String Integer 这些类java已经有实现对应的方法我们不需要去担心,所以我们只需要学习自定义对象即可

        第一种排序方式:
                        自然排序:让元素具有比较性
                        以键为Person为例
                        TreeMap<Person, String> tm = new TreeMap<>();
                                tm.put(new Person("小学僧", 23), "艾欧尼亚");
                                tm.put(new Person("托儿索", 25), "祖安");
                                tm.put(new Person("走地鸡", 24), "诺克萨斯");
                                tm.put(new Person("娃娃鱼", 26), "班德尔城");
                                System.out.println(tm);
                                          
                        //让键位置的自定义对象的类实现Comparable接口,实现compareTo方法
                        class Person implements Comparable<Person> {
                                @Override
                                public int compareTo(Person o) {
                                        return this.age - o.age;//根据年龄进行排序
                                }
                        }
       
                TreeMap 集合跟HashCode方法 equals方法无关。第一种排序只看键的类的compareTo的返回值
                        如果返回0,不存//认为是一样的
                        如果返回负数//存储在左边
                        如果返回正数//存储在右边
       
       
        第二种排序方式:
                        比较器排序:
                                给集合传递一个比较的规则。


                        TreeMap<Person, String> tm = new TreeMap<>(new Comparator<Person>() {
                                @Override
                                public int compare(Person o1, Person o2) {
                                        return o1.age - o2.age;
                                }
                        });
                        tm.put(new Person("小学僧", 23), "艾欧尼亚");
                        tm.put(new Person("托儿索", 25), "祖安");
                        tm.put(new Person("走地鸡", 24), "诺克萨斯");
                        tm.put(new Person("娃娃鱼", 26), "班德尔城");
                        System.out.println(tm);


        其中o1表示现在正在往里面存的这个元素
                        o2表示二叉树结构中正在要比较的那个元素。
                               
        TreeMap 集合跟HashCode方法 equals方法无关。第二种排序只看compare的返回值
                如果返回0,不存//认为是一样的
                如果返回负数//存储在左边
                如果返回正数//存储在右边


如果两种排序都存在,那么以第二种为准。第一种都不会去调用。
        我们实际开发的时候,默认使用第一种。
        在第一种满足不了要求的时候。此时按照第二种排。

        比如String。JAVA 默认使用字典顺序进行排序。现在要求要按照字符串的长度进行排序。
        我们不能直接修改JAVA里面的源码。只能使用第二种排序方式了。

        当我们无法修改第一种排序规则的时候,使用第二种排序规则。

1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马