在我们学习过程中,有一个集合可以让我们排序,还可以用键值对的形式存储,这个集合就是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里面的源码。只能使用第二种排序方式了。
当我们无法修改第一种排序规则的时候,使用第二种排序规则。
|
|