關(guān)于TreeMap自定義排序規(guī)則的兩種方式
TreeMap自定義排序規(guī)則的兩種方式
1、概述
TreeMap基于二叉樹數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),同時(shí)實(shí)現(xiàn)了SortedMap接口以保障元素順序存取,默認(rèn)按照鍵的升序排序,也可以自定義排序比較器;
TreeMap常用于實(shí)現(xiàn)排序的映射列表,在使用TreeMap時(shí)其key必須實(shí)現(xiàn)Comparable接口或采用自定義的比較器,否則會(huì)拋出java.lang.ClassCastExption異常;
2、演示:其key實(shí)現(xiàn)Comparable接口
代碼演示:
package com.zibo.java.february.third; import java.util.Set; import java.util.TreeMap; public class StuTreeMap { public static void main(String[] args) { TreeMap<Student,String> treeMap = new TreeMap<>(); treeMap.put(new Student("大哥",24),"大哥"); treeMap.put(new Student("二哥",23),"二哥"); treeMap.put(new Student("三哥",22),"三哥"); treeMap.put(new Student("四哥",21),"四哥"); Set<Student> studentSet = treeMap.keySet(); for (Student student : studentSet) { System.out.println(student.toString()); } } } // 這里就省略getter和setter方法了 class Student implements Comparable<Student>{ private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Student o) { // 實(shí)現(xiàn)Comparable接口在這里也是自定義排序規(guī)則 // 如果什么也不寫,直接默認(rèn)return 0的話,只能存儲(chǔ)第一個(gè)被put的元素 // 注意:升序就這么個(gè)寫法,不要看網(wǎng)上其他的什么相等返回0,相等的話要返回this.age,否則會(huì)出問題 if(age > o.age){ return 1; }else if(age < o.age){ return -1; } return this.age; } }
運(yùn)行結(jié)果:
Student{name='四哥', age=21}
Student{name='三哥', age=22}
Student{name='二哥', age=23}
Student{name='大哥', age=24}
3、演示:采用自定義比較器
代碼演示:
package com.zibo.java.february.third; import java.util.Comparator; import java.util.Set; import java.util.TreeMap; public class StuTreeMap2 { public static void main(String[] args) { TreeMap<Student2,String> treeMap = new TreeMap<>(new Comparator<Student2>() { @Override public int compare(Student2 o1, Student2 o2) { // 基本和key實(shí)現(xiàn)Comparable接口,重寫compareTo方法一致 // 升序排序就是這么寫的 if(o1.getAge() > o2.getAge()){ return 1; }else if(o1.getAge() < o2.getAge()){ return -1; } // 相等的時(shí)候不能返回0 return o1.getAge(); } }); treeMap.put(new Student2("大哥",24),"大哥"); treeMap.put(new Student2("二哥",23),"二哥"); treeMap.put(new Student2("三哥",22),"三哥"); treeMap.put(new Student2("四哥",21),"四哥"); Set<Student2> studentSet = treeMap.keySet(); for (Student2 student : studentSet) { System.out.println(student.toString()); } } } class Student2{ private String name; private int age; public Student2() { } public Student2(String name, int age) { this.name = name; this.age = 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; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
運(yùn)行結(jié)果:
Student{name='四哥', age=21}
Student{name='三哥', age=22}
Student{name='二哥', age=23}
Student{name='大哥', age=24}
總結(jié)
兩種方式區(qū)別不大,一個(gè)是key實(shí)現(xiàn)Comparable接口,重寫compareTo()方法,另一個(gè)是在TreeMap的構(gòu)造函數(shù)中創(chuàng)建new Comparator匿名內(nèi)部類,重寫compare 方法;
兩者實(shí)現(xiàn)的功能都是一樣的;注意寫法要按照代碼演示中寫;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java面試常問的Runnable和Callable的區(qū)別
大家好,本篇文章主要講的是java面試常問的Runnable和Callable的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Spring Cloud Config與Bus整合實(shí)現(xiàn)微服務(wù)配置自動(dòng)刷新功能
通過整合SpringCloud Config與Spring Cloud Bus,實(shí)現(xiàn)了微服務(wù)配置的自動(dòng)刷新功能,這個(gè)機(jī)制允許一個(gè)微服務(wù)實(shí)例在配置更新時(shí)通過消息總線通知其他所有實(shí)例同步更新,從而保持配置的一致性并提升系統(tǒng)的運(yùn)維效率2024-10-10Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案
這篇文章主要介紹了Mybatis有查詢結(jié)果但存不進(jìn)實(shí)體類的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題
這篇文章主要介紹了解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。 一起跟隨小編過來看看吧2020-08-08java接口用戶上下文的設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家介紹了接口用戶上下文的設(shè)計(jì)與實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11