Comparable接口——容器中自定义类排序
1、容器TreeMap,默认根据Key对象中某个属性的从小到大排列元素。
(1)如下代码示例,Key是整型数字,所以按照其从小到大的顺序排列
public class TestTreeMap {
public static void main(String[] args){
TreeMap<Integer,String> treeMap = new TreeMap<>();
treeMap.put(100,"1号");
treeMap.put(102,"2号");
treeMap.put(101,"3号");
System.out.println(treeMap);
}
}
/*output:
{100=1号, 101=3号, 102=2号}
*/
(2)当Key是自定义类的实例时,自定义类要实现Comparable<T>接口,重写compareTo(T)方法;
主要工作就是在自定义类中定义一个可以比较的属性,同时实现比较方法compareTo:
public class TestTreeMap {
public static void main(String[] args){
Person person1 = new Person(100,"张",5000);
Person person2 = new Person(102,"王",6000);
Person person3 = new Person(101,"李",7000);
TreeMap<Person,String> treeMap1 = new TreeMap<>();
treeMap1.put(person1,"一班");
treeMap1.put(person2,"二班");
treeMap1.put(person3,"三班");
Set<Map.Entry<Person,String>> set = treeMap1.entrySet();
for (Map.Entry<Person, String> entry : set) {
System.out.print(entry.getKey().id+"="+ entry.getValue()+'\t');
}
}
}
class Person implements Comparable<Person>{
public int id;
public String name;
public int salary;
public Person(int id, String name, int salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public Person(){
}
public int compareTo(Person e){
if (this.id > e.id){
return 1;
}else if(this.id < e.id){
return -1;
}else{
return 0;
}
}
}
/*output:
100=一班 101=三班 102=二班
*/
2、TreeSet和TreeMap类似,因为TreeSet的底层也是TreeMap实现,TreeSet存储的元素,底层是存放在TreeMap的Key位置
即TreeSet存储自定义类的对象时,也需要将自定义类实现Comparable<T>接口,此处分析省略
Comparable接口——容器中自定义类排序的更多相关文章
- VBA中自定义类和事件的(伪)注册
想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...
- C#中自定义类数组和结构数组的使用
如有雷同,不胜荣幸,若转载,请注明 C#中自定义类数组和结构数组的使用 最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一 ...
- Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?
在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...
- 十三、实现Comparable接口和new Comparator<T>(){ }排序的实现过程
参考:https://www.cnblogs.com/igoodful/p/9517784.html Collections有两种比较规则方式,第一种是使用自身的比较规则: 该类必须实现Compara ...
- java通过Comparable接口实现字符串比较大小排序的简单实例
/** * 对象比较大小compare的用法 字符串排序 * 练习代码, 给定字符串" nba" "cba" "ncaa" "wb ...
- ExtJS 中自定义类
首先我们来看一看在Javascript中,是怎样自定义类的: var Person = function (name, age) { this.Name = ""; this.Ag ...
- (转).Net中自定义类作为Dictionary的key详解
在定义数据结构时,Dictionary提供了快速查找数据的功能,另外Dictionary< TKey, TValue >属于key-value键值对数据结构,提供了泛型的灵活性,是数据结构 ...
- MFC中 自定义类访问主对话框控件的方法
之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...
- Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?
这是因为Python3中,str的输出是调用类的实例方法__str__来输出,如果__str__方法没有重写,则自动继承object类的__str__方法,而object类的__str__方法是调用_ ...
随机推荐
- ajax访问当前页面后的 [WebMethod]描述的方法
脚本: function show() { $.ajax({ type: "post", async: false, contentType: "application/ ...
- 屏幕录像专家exe视频批量翻录成视频avi格式
笔者下载过一些视频,全部是屏幕录像专家录制的exe视频,这些视频没有密码,可以顺利打开看看. 有一日想把这些视频转换成wmv格式放到手机上查看.一个目录下有那么大exe视频.一个个转特别麻烦. 后来想 ...
- Bioconductor简介
Bioconductor简介 2012-10-09 ~ ADMIN 源:Bioconductor: open software development for computational biolog ...
- 02 请求库之 selenium模块
selenium模块 一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动 ...
- Laravel5.5 使用队列 Queue
使用队列# 上一章节中我们开发了自动生成 Slug 功能,但是因为我们的需要实时请求百度翻译接口,这将会是一个系统性能隐患. 一般情况下,网络请求会存在各种不确定性,如果请求 API 出现超时情况,或 ...
- Laravel框架中实现supervisor执行异步进程
问题描述:在使用Laravel框架实现动态网页时,若有些操作计算量较大,为了不影响用户体验,往往需要使用异步方式去处理.这里使用supervisor和laravel自带的queues实现. Super ...
- [Fiddler] 开启Fiddler抓包的时候产品报“证书错误”
报错截图: 解决办法:同时开启产品和Fiddler,做如下处理:
- Fiddler的钩子hook导致电脑无法连上网络
今天,电脑怎么都无法连上网络,重启了几次电脑也不行,网络环境是没有问题的,后来同事告诉我,Fiddler有一个BUG,就是Fiddler获取钩子之后没有释放掉,必须启动Fiddler,再关闭Fiddl ...
- OSGi 系列(十二)之 Http Service
OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...
- Windows10 Virtualization Technology虚拟化技术功能
为什么要开启VT功能,做机器学习环境搭建.运用Docker容器等等,所以首先要确认一下机器是否已经开启了VT技术功能,以此记录一下经历而已. VT是什么?为什么要开启VT?VT是一种虚拟化技术,可以扩 ...