Java 之 Comparable vs Comparator
Comparable和Compator都是用于给集合排序的接口,但是他们之间的区别是什么呢。
- Comparable: 这个接口只有一个方法
compareTo
。比如我们想通过年龄给用户排序,那么我们的用户要实现Comparable接口的方法,假如一旦要通过用户的评分进行排序,我们就必须要修改compareTo方法。
// o 是要比较的对象
// 返回负数,小于要比较的对象
// 返回 0 ,等于要比较的对象
// 返回正数,大于要比较的对象
public interface Comparable<T> {
public int compareTo(T o);
}
- Comparator: 这个接口有两个方法,equals和compare. 要进行比较的类不一定非要实现Comparator接口,由第三方的类实现这个接口来进行排序。 这样的话,排序的种类就可以有很多种,并且像对用户进行排序,我们可以通过年龄,姓名,评分等进行排序也不用修改用户类。我们要做的应该就是写 AgeComparator,NameComparator,RankComparator.
public interface Comparator<T> {
// 返回负数,第一个小于第二个的对象,o1 < o2
// 返回 0 ,对象相等 o1 = o2
// 返回正数,第一个大于第二个对象 o1 > o2
int compare(T o1, T o2);
// 判断Compator之间是不是相同的
boolean equals(Object obj);
}
案例
通过Comaparable排序
- 如果是通过评分(rank)进行排序,User类写法如下
public class User implements Comparable<User>{
private Integer id;
private Integer rank;
private Integer age;
private String name;
//getter and setter
public User(Integer rank, Integer age, String name) {
this.rank = rank;
this.age = age;
this.name = name;
}
// 通过rank进行排序
@Override
public int compareTo(User o) {
return this.getRank() - o.getRank();
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", rank=" + rank +
", age=" + age +
'}';
}
}
- 如果想要通过年龄进行排序,那么就要修改User对象。
public class User implements Comparable<User>{
private Integer id;
private Integer rank;
private Integer age;
private String name;
//getter and setter
public User(Integer rank, Integer age, String name) {
this.rank = rank;
this.age = age;
this.name = name;
}
// 通过rank进行排序
@Override
public int compareTo(User o) {
return this.getAge() - o.getAge();
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", rank=" + rank +
", age=" + age +
'}';
}
}
- 写测试类。
public class App {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("aihe",100,23));
list.add(new User("weidong",80,25));
list.add(new User("zhangbo",85,28));
list.add(new User("leizhen",90,29));
Collections.sort(list);
System.out.println(list);
}
}
通过Comparator进行排序
- 如果是通过Rank进行排序,创建RankComparator类。
public class RankComparator implements Comparator<User> {
// 通过rank进行排序
public int compare(User o1, User o2) {
return o1.getRank() - o2.getRank();
}
}
- 如果是通过年龄进行排序,创建AgeComparator类。
public class AgeComparator implements Comparator<User> {
// 通过age进行排序
public int compare(User o1, User o2) {
return o1.getAge() - o2.getAge();
}
}
- 测试类。
public class App {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("aihe",100,23));
list.add(new User("weidong",80,25));
list.add(new User("zhangbo",85,28));
list.add(new User("leizhen",90,29));
Collections.sort(list,new RankComparator());
//Collections.sort(list,new AgeComparator());
System.out.println(list);
}
}
小结
如果我们的排序方式一般不会变化,我们知道要排序什么字段,在创建对象的时候可以直接实现Comparable接口。
如果我们还不清楚要比较什么字段,那么可以等到后续确定的时候实现Comparator接口,Comparator接口是从外部进行排序,不会对对象产生影响。
参考

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
10月26日云栖精选夜读 | 晚上自学java两个月能找工作吗?
如果只是靠晚上自学两个月直接找一份java的工作在当前基本上很难,虽然现在java还是就业第一大语言,但入门的门槛明显高了许多,现在看招聘岗位上java几乎占到了很大比例,为什么职位多反而门槛提升了?主要还是从业人数增加特别是每年培训出来大量的初学者,虽然职位很多但职位本身的要求还是挺高,以致于很多培训完了觉得水平应该可以了,结果很多碰壁了,已经不是十几年前懂点编程知识就能找到工作的时代了,记得入行第一家软件公司的时候,边上的有个同事在宿舍自学了一个月的C语言,然后出来找工作,虽然不是很顺利但面试了几次涨了点经验最后还是找到了做软件的公司,这种现象放在当前的编码领域几乎是不可能的事情。 热点热议 晚上自学java两个月能找工作吗? 作者:技术小能手 发表在:程序员互动联盟 阿里五年,我还记得最初为什么出发 作者:技术小能手发表在:阿里味儿 PS背后的神秘AI力量 是Adobe憋了十年的神功 作者:技术小能手发表在:智东西 知识整理 Java 8 和 Scala 中的 Lambda 表达式 作者:技术小能手发表在:开源中国 scala和java数据类型转换 作者:技术小能手发表在:开源中...
-
下一篇
Python高级知识点学习(七)
HTTP、Socket、TCP概念 socket属于常用的http协议之下的让我们可以使用tcp/ip协议的一个接口。 socket编程 image.png socket编程的模式其实是非常固定的。 上图: 左侧server端 右侧client端 server必须是随时处于一个监听的状态和服务的状态,因为不知道客户端什么时候会发送来请求。 绑定协议、地址、端口。 每一个应用程序只能占用一个端口,服务器a到服务器b发数据时,数据是不知道是由哪个应用程序接受的,这时候就需要端口机制,每一个应用程序提供一个端口。 socket连接后,只要不关闭连接,服务端可以一直给客户端发送请求,但是在http中,只完成一次发送数据就停止了。 编写测试代码: 新建文件sever.py import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定ip 端口 server.bind(('0.0.0.0', 8000)) # 监听 server.listen() sock, addr = server.accept() ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程