TreeMap
1.7 TreeMap集合
1.TreeMap介绍
TreeMap集合和Map相比没有特有的功能,底层的数据结构是红黑树;可以对元素的键进行排序,排序方式有两种:自然排序和比较器排序;到时使用的是哪种排序,取决于我们在创建对象的时候所使用的构造方法;
public TreeMap() 使用自然排序 public TreeMap(Comparator<? super K> comparator) 比较器排序
2.演示
案例演示自然排序
public static void main(String[] args) { TreeMap<Integer, String> map = new TreeMap<Integer, String>(); map.put(1,"张三"); map.put(4,"赵六"); map.put(3,"王五"); map.put(6,"酒八"); map.put(5,"老七"); map.put(2,"李四"); System.out.println(map); } 控制台的输出结果为: {1=张三, 2=李四, 3=王五, 4=赵六, 5=老七, 6=酒八}
案例演示比较器排序
需求:
创建一个TreeMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并遍历。
要求按照学生的年龄进行升序排序,如果年龄相同,比较姓名的首字母升序, 如果年龄和姓名都是相同,认为是同一个元素;
实现:
为了保证age和name相同的对象是同一个,Student类必须重写hashCode和equals方法
public class Student { private int age; private String name; //省略get/set.. public Student() {} public Student(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(age, name); } }
public static void main(String[] args) { TreeMap<Student, String> map = new TreeMap<Student, String>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { //先按照年龄升序 int result = o1.getAge() - o2.getAge(); if (result == 0) { //年龄相同,则按照名字的首字母升序 return o1.getName().charAt(0) - o2.getName().charAt(0); } else { //年龄不同,直接返回结果 return result; } } }); map.put(new Student(30, "jack"), "深圳"); map.put(new Student(10, "rose"), "北京"); map.put(new Student(20, "tom"), "上海"); map.put(new Student(10, "marry"), "南京"); map.put(new Student(30, "lucy"), "广州"); System.out.println(map); } 控制台的输出结果为: { Student{age=10, name='marry'}=南京, Student{age=10, name='rose'}=北京, Student{age=20, name='tom'}=上海, Student{age=30, name='jack'}=深圳, Student{age=30, name='lucy'}=广州 }