關(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)文章
ZooKeeper官方文檔之Java客戶端開發(fā)案例翻譯
網(wǎng)上有很多ZooKeeper的java客戶端例子,我也看過很多,不過大部分寫的都不好,有各種問題。兜兜轉(zhuǎn)轉(zhuǎn)還是覺得官方給的例子最為經(jīng)典,在學(xué)習(xí)之余翻譯下來,供朋友們參考2022-01-01
Docker環(huán)境下Spring Boot應(yīng)用內(nèi)存飆升分析與解決場(chǎng)景分析
當(dāng)運(yùn)行一個(gè)Spring Boot項(xiàng)目時(shí),如果未設(shè)置JVM內(nèi)存參數(shù),Spring Boot默認(rèn)會(huì)采用JVM自身默認(rèn)的配置策略,接下來通過本文給大家介紹Docker環(huán)境下Spring Boot應(yīng)用內(nèi)存飆升分析與解決方法,需要的朋友參考下吧2021-08-08
在Mac下IDEA安裝并使用protobuf方式(Java)
這篇文章主要介紹了在Mac下IDEA安裝并使用protobuf方式(Java),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

