当前位置:   article > 正文

TreeMap自定义排序规则的两种方式

treemap自定义排序

目录

一、TreeMap自定义排序规则的两种方式

1、概述

2、演示:其key实现Comparable接口

代码演示:

运行结果:

3、演示:采用自定义比较器

代码演示:

运行结果:

4、小结


一、TreeMap自定义排序规则的两种方式

1、概述

TreeMap基于二叉树数据结构存储数据,同时实现了SortedMap接口以保障元素顺序存取,默认按照键的升序排序,也可以自定义排序比较器;

TreeMap常用于实现排序的映射列表,在使用TreeMap时其key必须实现Comparable接口采用自定义的比较器,否则会抛出java.lang.ClassCastExption异常;

 

2、演示:其key实现Comparable接口

代码演示:

  1. package com.zibo.java.february.third;
  2. import java.util.Set;
  3. import java.util.TreeMap;
  4. public class StuTreeMap {
  5. public static void main(String[] args) {
  6. TreeMap<Student,String> treeMap = new TreeMap<>();
  7. treeMap.put(new Student("大哥",24),"大哥");
  8. treeMap.put(new Student("二哥",23),"二哥");
  9. treeMap.put(new Student("三哥",22),"三哥");
  10. treeMap.put(new Student("四哥",21),"四哥");
  11. Set<Student> studentSet = treeMap.keySet();
  12. for (Student student : studentSet) {
  13. System.out.println(student.toString());
  14. }
  15. }
  16. }
  17. // 这里就省略getter和setter方法了
  18. class Student implements Comparable<Student>{
  19. private String name;
  20. private int age;
  21. public Student() {
  22. }
  23. public Student(String name, int age) {
  24. this.name = name;
  25. this.age = age;
  26. }
  27. @Override
  28. public String toString() {
  29. return "Student{" +
  30. "name='" + name + '\'' +
  31. ", age=" + age +
  32. '}';
  33. }
  34. @Override
  35. public int compareTo(Student o) {
  36. // 实现Comparable接口在这里也是自定义排序规则
  37. // 如果什么也不写,直接默认return 0的话,只能存储第一个被put的元素
  38. // 注意:升序就这么个写法,不要看网上其他的什么相等返回0,相等的话要返回this.age,否则会出问题
  39. if(age > o.age){
  40. return 1;
  41. }else if(age < o.age){
  42. return -1;
  43. }
  44. return this.age;
  45. }
  46. }

 

运行结果:

  1. Student{name='四哥', age=21}
  2. Student{name='三哥', age=22}
  3. Student{name='二哥', age=23}
  4. Student{name='大哥', age=24}

 

3、演示:采用自定义比较器

代码演示:

  1. package com.zibo.java.february.third;
  2. import java.util.Comparator;
  3. import java.util.Set;
  4. import java.util.TreeMap;
  5. public class StuTreeMap2 {
  6. public static void main(String[] args) {
  7. TreeMap<Student2,String> treeMap = new TreeMap<>(new Comparator<Student2>() {
  8. @Override
  9. public int compare(Student2 o1, Student2 o2) {
  10. // 基本和key实现Comparable接口,重写compareTo方法一致
  11. // 升序排序就是这么写的
  12. if(o1.getAge() > o2.getAge()){
  13. return 1;
  14. }else if(o1.getAge() < o2.getAge()){
  15. return -1;
  16. }
  17. // 相等的时候不能返回0
  18. return o1.getAge();
  19. }
  20. });
  21. treeMap.put(new Student2("大哥",24),"大哥");
  22. treeMap.put(new Student2("二哥",23),"二哥");
  23. treeMap.put(new Student2("三哥",22),"三哥");
  24. treeMap.put(new Student2("四哥",21),"四哥");
  25. Set<Student2> studentSet = treeMap.keySet();
  26. for (Student2 student : studentSet) {
  27. System.out.println(student.toString());
  28. }
  29. }
  30. }
  31. class Student2{
  32. private String name;
  33. private int age;
  34. public Student2() {
  35. }
  36. public Student2(String name, int age) {
  37. this.name = name;
  38. this.age = age;
  39. }
  40. public String getName() {
  41. return name;
  42. }
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. public int getAge() {
  47. return age;
  48. }
  49. public void setAge(int age) {
  50. this.age = age;
  51. }
  52. @Override
  53. public String toString() {
  54. return "Student{" +
  55. "name='" + name + '\'' +
  56. ", age=" + age +
  57. '}';
  58. }
  59. }

 

运行结果:

  1. Student{name='四哥', age=21}
  2. Student{name='三哥', age=22}
  3. Student{name='二哥', age=23}
  4. Student{name='大哥', age=24}

 

4、小结

两种方式区别不大,一个是key实现Comparable接口,重写compareTo()方法,另一个是在TreeMap的构造函数中创建new Comparator匿名内部类,重写compare 方法;两者实现的功能都是一样的;注意写法要按照代码演示中写;

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/900292
推荐阅读
相关标签
  

闽ICP备14008679号