集合-Comparator和Comparable
文章内容参考博客:https://www.cnblogs.com/xujian2014/p/5215082.html
1.Comparable
Comparable是排序接口,当一个类实现了Comparable接口后,就以为着该类支持排序。实现了Comparable接口的类,其组成的数组和列表就可以通过Collections的工具进行自动排序。
而实现了Comparable接口的对象也可以用作有序映射(LinkedHashMap)中的键,或者有序集合中的集合,无序指定比较器Comparator。
public class Person implements Comparable<Person> {
private String name;
private int id;
private int age;
public String getName(){return name;}
public int getId(){ return id;}
public int getAge(){return age;}
public void setName(String name){this.name=name;}
public void setId(int id){this.id=id;}
public void setAge(int age){this.age = age;}
@Override
public int compareTo(Person p) {
if(age<p.getAge())
return 1;
else
return -1;
}
}
你可以在重写的compareTo方法中实现更加复杂的比较,而返回的值决定其是升序还是降序,具体如下:
| 返回值 | A>B | A<B |
| return 1 | 升序 | 降序 |
| return -1 | 降序 | 升序 |
此时实现一个Person的表
List<Person> list = new ArrayList<>();
for(int i = 0; i<10; i++ ){
Person person = new Person();
person.setId(i);
person.setName("person-"+i);
person.setAge(i*5);
list.add(person);
}
调用Collections.sort结果为:降序
[Name=hero-9,Id=9,Age=45], [Name=hero-8,Id=8,Age=40], [Name=hero-7,Id=7,Age=35], [Name=hero-6,Id=6,Age=30], [Name=hero-5,Id=5,Age=25], [Name=hero-4,Id=4,Age=20]
如果改变在Person中重写的compareTo的返回值,则结果为 升序
[Name=hero-0,Id=0,Age=0], [Name=hero-1,Id=1,Age=5], [Name=hero-2,Id=2,Age=10], [Name=hero-3,Id=3,Age=15], [Name=hero-4,Id=4,Age=20], [Name=hero-5,Id=5,Age=25], [Name=hero-6,Id=6,Age=30]
2.Comparator
Comparator是比较器接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
我们可以直接创建一个比较器,然后来重写其比较方法:
Comparator<Person> cp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return 0;
}
};
或者创建一个比较器类,实现Comparator接口,重写其中的方法,并在Collections.sort()中调用:
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1,Person o2) {
return 0;
}
}
3.两者的区别
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
集合-Comparator和Comparable的更多相关文章
- Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...
- 集合排序 Comparator和Comparable的使用区别
Java 排序 Compare Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...
- Java集合排序方法comparable和comparator的总结
一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...
- Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...
- Java自学-集合框架 Comparator和Comparable
Java Comparator和Comparable 步骤 1 : Comparator 假设Hero有三个属性 name,hp,damage 一个集合中放存放10个Hero,通过Collection ...
- 【原】Comparator和Comparable的联系与区别
1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...
- java之Comparator与Comparable
转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...
- java的Comparator和Comparable
java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. ...
- Comparator与Comparable用法与区别
一.概述. Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...
随机推荐
- Python学习--Python变量类型
变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...
- SpringMVC项目读取不到外部CSS文件的解决办法及总结
昨天,在写一个新需求的时候,因为没有前端同事的对接,无奈只有自己写css,js放到ssm结构的后台项目中,因为之前开发都是把前端文件放在一个专门的服务器上,一直没有关注服务端项目读取静态资源的问题,运 ...
- Linux内存管理 (1)物理内存初始化
专题:Linux内存管理专题 关键词:用户内核空间划分.Node/Zone/Page.memblock.PGD/PUD/PMD/PTE.lowmem/highmem.ZONE_DMA/ZONE_NOR ...
- Golang 入门系列(十一)Go语言实现webapi
之前,已经讲过很多Golang的东西,比如基础语法,mysql的使用,redis的使用等等,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/ca ...
- Lepus搭建企业级数据库全方位监控系统
前言 Lepus(天兔)数据库企业监控系统是一套由专业DBA针对互联网企业开发的一款专业.强大的企业数据库监控管理系统,企业通过Lepus可以对数据库的实时健康和各种性能指标进行全方位的监控.目前已经 ...
- 解决Jenkins邮件配置问题
最近要配置Jenkins邮箱,由于一直报如下错误,又没办法解决,所以想到了另外的办法发邮件. 我采用shell脚本执行python命令的方式来发邮件: #!/bin/bash cd /software ...
- JDBC数据库连接池之dbcp
一.连接池的作用 数据库的连接是一种很重要的资源,如果一个项目比较小,连接数据库的次数比较少,我们可以采取直连的方式:“获取连接----使用----关闭连接”.但是如果一个网站访问量很大,假如同时有几 ...
- hdu-5786(补图最短路)
题意:给你n个点,m条无向边,问你这n个点构成的完全图,不用那m条边,由一个s出现的单源最短路 解题思路:首先,暴力建图不行,点太多,那么我们就按照它的规则来,把m条边建好,但是建的这个图表示不走的方 ...
- jsp篇 之 指令元素和动作元素
Jsp指令元素分类与书写格式: 书写格式: <%@ 指令类型 属性="值" .. %> 分类: [page include taglib]三种. 1,page指令: ...
- 转:ls用法详解
在Linux中显示文件大小的时候,通常的做法是使用“ls -l”,显示的大小是文件的字节大小. 但是,如果文件比较大的话,显示起来不是特别易读,这个时候,可以使用“ls -lh”,就可以使用比较接近文 ...