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=酒八}

案例演示比较器排序

需求:

  1. 创建一个TreeMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并遍历。

  2. 要求按照学生的年龄进行升序排序,如果年龄相同,比较姓名的首字母升序, 如果年龄和姓名都是相同,认为是同一个元素;

    实现:

为了保证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'}=广州
}
全部评论

相关推荐

一天代码十万三:这个学历有中大厂实习也是0面,没办法,斩杀线是这样的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务