1. 根据 key 排序

引言

  • TreeMap 中key 可以自动String 类型或8大基本类型的包装类型进行排序
  • 但是,TreeMap 无法直接自定义类型进行排序。
  • 当我们想对对 TreeMapkey 中的自定义类型排序时,必须要指定**排序规则。主要有两种解决方案**:

根据 key 排序,主要有两种方法

  1. 方法1:实现 Comparator 接口,并传递给 TreeMap 构造器;
  2. 方法2:使得 key 对应类 implements Comparable接口

两种排序规则如何选择呢?

  • 当比较规则不会发生改变的时候,或者说比较规则只有一个的时候,建议实现 Comparable 接口;
  • 比较规有多个,并且需要在多个比较规则之间频繁切换时,建议使用 Comparator 比较器。

方法1:实现 Comparator 接口

import java.util.*;class Solution {public static void main(String[] args) {Map<Person, String> map = new TreeMap<>((person1, person2) -> {// 先按照age降序排序if (person1.getAge() - person2.getAge() != 0) {return person2.getAge() - person1.getAge();}// age相同时,按照name升序排序return person1.getName().compareTo(person2.getName());});map.put(new Person("zhangsan", 15), "001");map.put(new Person("lisi", 18), "002");map.put(new Person("wangwu", 20), "003");map.put(new Person("zhaoliu", 18), "004");map.put(new Person("ouyangfeng", 60), "006");map.put(new Person("hongqigong", 60), "005");System.out.println("排序后,map = ");for (Map.Entry<Person, String> entry : map.entrySet()) {System.out.println(entry);}}
}class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name = " + name +", age = " + age +'}';}
}

运行结果如下:

方法2:implements Comparable

import java.util.*;class Solution {public static void main(String[] args) {Map<Person, String> map = new TreeMap<>();map.put(new Person("zhangsan", 15), "001");map.put(new Person("lisi", 18), "002");map.put(new Person("wangwu", 20), "003");map.put(new Person("zhaoliu", 18), "004");map.put(new Person("ouyangfeng", 60), "006");map.put(new Person("hongqigong", 60), "005");System.out.println("排序后,map = ");for (Map.Entry<Person, String> entry : map.entrySet()) {System.out.println(entry);}}
}//
class Person implements Comparable<Person> {private String name;private int age;@Overridepublic int compareTo(Person person) {// 先按照age降序排序if (this.getAge() - person.getAge() != 0) {return person.getAge() - this.getAge();}// age相同时,按照name升序排序return this.getName().compareTo(person.getName());}public int getAge() {return age;}public String getName() {return name;}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name = " + name +", age = " + age +'}';}
}

2. 根据 value 排序

同上根据 key 排序,根据 value 排序时,也可以有两种方法,这里仅仅展示“实现Comparator接口”的方法

map 根据 value 排序时,和根据 key 排序相比 较为繁琐,具体步骤如下:

  1. map.entrySet() 转存至 list,即 lsit 中每个元素的类型为 Map.Entry
  2. 利用 Collections.sort 根据 listertry.getValue() 进行排序;
  3. “实现Comparator接口”,自定义 ertry.getValue() 的排序规则
import java.util.*;class Solution {public static void main(String[] args) {Map<String, Person> map = new HashMap<>();map.put("001", new Person("zhangsan", 15));map.put("002", new Person("lisi", 18));map.put("003", new Person("wangwu", 20));map.put("004", new Person("zhaoliu", 18));map.put("006", new Person("ouyangfeng", 60));map.put("005", new Person("hongqigong", 60));System.out.println("排序前,map = " );for (Map.Entry<String, Person> entry : map.entrySet()) {System.out.println(entry);}// 1、map to listList<Map.Entry<String, Person>> entries = new ArrayList<>(map.entrySet());// 2、重写排序规则Collections.sort(entries, (entry1, entry2) -> {Person person1 = entry1.getValue();Person person2 = entry2.getValue();// 先按照age降序排序if (person1.getAge() - person2.getAge() != 0) {return person2.getAge() - person1.getAge();}// age相同时,按照name升序排序return person1.getName().compareTo(person2.getName());});System.out.println("\n排序后,entries = ");for (Map.Entry<String, Person> entry : entries) {System.out.println(entry);}}
}class Person {private String name;private int age;public String getName() {return name;}public int getAge() {return age;}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name = " + name +", age = " + age +'}';}
}

运行结果如下:

【TreeMap】-根据 key 或 value 排序相关推荐

  1. TreeMap实现对中文的排序

    import java.util.TreeMap;/*** @author silence* TreeMap实现对中文的排序* TreeMap会根据键排序,String实现了Comparable接口实 ...

  2. Map根据Key值进行排序(升序加降序)

    Map根据Key值进行排序 如果这篇文章对你有帮助的话,希望可以给博主点个赞,感谢!! 今天在写一个功能的时候,需要根据日期进行分组,于是我从数据库查找的时候就使用order by create_ti ...

  3. 为bib文件中文参考文献的key域添加排序用拼音

    为bib文件中文参考文献的key域添加排序用拼音 这也是我在latexstudio写的文章. 请直接看: [为bib文件中文参考文献的key域添加排序用拼音]

  4. java学习:容器排序:TreeMap和TreeSet实现自定义排序的使用方法?两者的区别?

    文章目录 TreeMap和TreeSet实现自定义排序的实现 1.TreeMap实现自定义排序 (1)构造函数中new Comparator,匿名内部类,重写compare 方法. (2)实体类实现C ...

  5. java8 treemap 排序_Java中TreeMap按照KEY排序实现讲解

    TreeMap 是一个有序的key-value集合,它是通过红黑树实现的,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法.继承于A ...

  6. java中的几种泛型类——HashSet、HashMap、TreeSet、TreeMap,遍历map,排序,HashTable比较

    HashSet HashSet<E>泛型类在数据组织上类似于数学上的集合,可以进行"交"."并"."差"等运算. HashSet ...

  7. Map集合根据key,value排序

    /*** 根据map的key排序* * @param map 待排序的map* @param isDesc 是否降序,true:降序,false:升序* @return 排序好的map*/public ...

  8. stream流倒序排序_java8 stream 操作map根据key或者value排序的实现|chu

    引言 最近小编自己一个人在负责一个项目的后台开发,其中有一部分是统计相关的功能,所以需要一些排序或者分组的操作,之前这种操作小编觉得还是比较麻烦的,虽热有一些现成的工具类,但是工具类的写法也是比较复杂 ...

  9. java8 list map 排序_java8如何对list中的map元素根据多个key值进行排序

    使用JAVA自己的排序方法,有的时候是一个可行的选择. 先从简单的开始说起. 一.少数key的情况 有一个需求:根据 menu_level,sort排序,越小的越前面. -- 下面代码按照升序规则进行 ...

最新文章

  1. 科技贡献新力量:无人驾驶清扫车上路
  2. JavaScript原理学习
  3. 64位虚拟机安装64位ubuntu出现问题
  4. error: '__gnu_cxx::_Lock_policy' has not been declared
  5. Java并发ReadWriteLock接口
  6. 7-1 作业调度算法--先来先服务 (30 分)(思路+详解+vector+map+map做法)Come Baby!!!!!!!!!!!
  7. java flushdb_JAVA - Redis
  8. Visual studio code清除终端数据
  9. 数据库原理及应用教程第四版课后答案
  10. Linux桌面系统远程访问全解析
  11. 如何更电计算机共享名称,电脑网络共享设置
  12. 微星x58pro支持服务器内存吗,免费午餐 微星全线X58升级BIOS支持SLI
  13. Base64Utils 快速使用
  14. ME525 刷机历险记
  15. 综合日语第一册第十三课
  16. python自动生成ppt报告_把时间还给洞察,且看PPT调研报告自动生成攻略
  17. python中while循环并列_Python中while循环的一个问题
  18. 商城系统面试题(二)
  19. android Git版本控制
  20. STM32CubeMX之FMC同时挂载SDRAM(W9825G6KH)和TFTLCD

热门文章

  1. 2022年顶封抗疫欢迎更多城市的生态合作伙伴加入核芯物联国产蓝牙AOA高精度亚米级定位生态解决方案展厅计划
  2. 旅游网案例:登录功能
  3. jupyter文件转换为py文件
  4. 2018java对笔记本配置要求_Revit对笔记本配置的要求
  5. 图片另存为找不到桌面
  6. C++综合练习——键盘坏了
  7. Linux 后台运行python .sh等程序,以及查看和关闭后台运行程序操作
  8. ipad分屏_iPadOS 上手:桌面级体验,让 iPad 离生产力更近一步
  9. u盘重装系统步骤win10系统重装教程
  10. 鸿蒙碎片八零,天道天骄_第2688章 一方鸿蒙的碎片!上(1/2)_邂逅小说网