treemap自定义排序规则的两种方式
1、概述
treemap基于二叉树数据结构存储数据,同时实现了sortedmap接口以保障元素顺序存取,默认按照键的升序排序,也可以自定义排序比较器;
treemap常用于实现排序的映射列表,在使用treemap时其key必须实现comparable接口或采用自定义的比较器,否则会抛出java.lang.classcastexption异常;
2、演示:其key实现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) { // 实现comparable接口在这里也是自定义排序规则 // 如果什么也不写,直接默认return 0的话,只能存储第一个被put的元素 // 注意:升序就这么个写法,不要看网上其他的什么相等返回0,相等的话要返回this.age,否则会出问题 if(age > o.age){ return 1; }else if(age < o.age){ return -1; } return this.age; } }
运行结果:
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实现comparable接口,重写compareto方法一致 // 升序排序就是这么写的 if(o1.getage() > o2.getage()){ return 1; }else if(o1.getage() < o2.getage()){ return -1; } // 相等的时候不能返回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 + '}'; } }
运行结果:
student{name='四哥', age=21}
student{name='三哥', age=22}
student{name='二哥', age=23}
student{name='大哥', age=24}
总结
两种方式区别不大,一个是key实现comparable接口,重写compareto()方法,另一个是在treemap的构造函数中创建new comparator匿名内部类,重写compare 方法;
两者实现的功能都是一样的;注意写法要按照代码演示中写;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论