今天在项目开发中,遇到要对List中的对象按照对象某一属性进行排序的问题,我发现有两种实现方式:

(1)实现Comparable接口;

(2)实现Comparator接口;

Comparable和Comparator的实现

Comparable接口

JDK的大量的类包括常见的 String、Byte、Char、Date等都实现了Comparable接口。

实现方法:需要排序的类实现Comparable接口,并实现接口的compareTo方法;

实例:按照User的年龄进行倒序排序

public class User implements Comparable<User>{

	private String name;
private int age; public User(String name, int age) {
super();
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 "User [name=" + name + ", age=" + age + "]";
} @Override
public int compareTo(User o) {
if(o!=null){
if(this.getAge()>o.getAge()){
return -1;
}else if(this.getAge()==o.getAge()){
return 0;
}
}
return 1;
}
}
public static void main(String[] args){
List<User> userList = new ArrayList<>();
userList.add(new User("Tom",2));
userList.add(new User("jack",23));
userList.add(new User("Shushan",1));
userList.add(new User("Idhua",21)); Collections.sort(userList);
System.out.println(userList);
}

输出结果:

[User [name=jack, age=23], User [name=Idhua, age=21], User [name=Tom, age=2], User [name=Shushan, age=1]]

Comparator接口

实现方法:新建一个类,实现Comparator接口,并实现compare方法;

实例:使用匿名内部类、lambda或者新建一个类实现都行

public class Person {

	private String name;
private int number; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getNumber() {
return number;
} public void setNumber(int number) {
this.number = number;
} public Person(String name, int number) {
super();
this.name = name;
this.number = number;
} @Override
public String toString() {
return "Person [name=" + name + ", number=" + number + "]";
}
}
public static void main(String[] args){
List<Person> list = new ArrayList<Person>();
list.add(new Person("Kobi", 1));
list.add(new Person("Cury", 3));
list.add(new Person("ZhanMushi", 2));
list.add(new Person("Dulante", 4));
list.add(new Person("Jordan", 0)); //匿名内部类版本(根据number进行排正序)
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
if(o1.getNumber() < o2.getNumber()){
return -1;
}else if(o1.getNumber() == o2.getNumber()){
return 0;
}
return 1;
}
}); //lambda版本(根据number排正序)
/*Collections.sort(list, (o1,o2)->{
if(o1.getNumber() < o2.getNumber()){
return -1;
}else if(o1.getNumber() == o2.getNumber()){
return 0;
}
return 1;
});
*/ //新建一个类实现版本(根据name字段进排正序)
//Collections.sort(list,new PersonComparator()); System.out.println(list);
}
public class PersonComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}

输出结果

匿名内部类版本和lambda版本:[Person [name=Jordan, number=0], Person [name=Kobi, number=1], Person [name=ZhanMushi, number=2], Person [name=Cury, number=3], Person [name=Dulante, number=4]]

新建一个类实现版本:

[Person [name=Cury, number=3], Person [name=Dulante, number=4], Person [name=Jordan, number=0], Person [name=Kobi, number=1], Person [name=ZhanMushi, number=2]]

总结

两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,

但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义

的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自

己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

参考自

http://www.cnblogs.com/szlbm/p/5504634.html

http://blog.csdn.net/mageshuai/article/details/3849143

http://www.cnblogs.com/sunflower627/p/3158042.html

Comparable和Comparator的学习笔记的更多相关文章

  1. Java Comparator接口学习笔记

    Comparator是一个泛型函数式接口,T表示待比较对象的类型: @FunctionalInterface public interface Comparator<T> { } 本文将主 ...

  2. java学习笔记13--比较器(Comparable、Comparator)

    java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. 20145330第五周《Java学习笔记》

    20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...

  5. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  6. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  7. Java8——快速入门手册(学习笔记)

    github博文传送门 Java8特性学习笔记 Java8中新增了许多的新特性,在这里本人研究学习了几个较为常用的特性,在这里与大家进行分享.(这里推荐深入理解Java 8用于理解基础知识)本文分为以 ...

  8. javaSE学习笔记(10)---List、Set

    javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...

  9. JavaSE 学习笔记01丨开发前言与环境搭建、基础语法

    本蒟蒻学习过C/C++的语法,故在学习Java的过程中,会关注于C++与Java的区别.开发前言部分,看了苏星河教程中的操作步骤.而后,主要阅读了<Java核心技术 卷1 基础知识>(第8 ...

随机推荐

  1. P1823 Patrik 音乐会的等待

    题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟进行谈笑风生.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看 ...

  2. iOS MapKit地图

    地图框架:#import <MapKit/MapKit.h> 基本属性和方法: 属性: 地图类视图:MKMapView 地图类型:MKMapType mapType 地图旋转:rotate ...

  3. Python 初始—(文件操作)

    文件修改,我们可以不用讲一个文件全部都进行读取,然后放入内存,如果文件过大,容易造成内存的 内存溢出问题 因此我们可以便读取边进行修改操作 f=open("old.txt",&qu ...

  4. ssm整合-错误2

    1 警告: No mapping found for HTTP request with URI [/management] in DispatcherServlet with name 'dispa ...

  5. MySql编码、卸载、启动问题

    一.启动问题 计算机------管理------服务------找到MySql------右键------启动或停止 问题:打开Mysql,点击 MySQL Command Line Client,输 ...

  6. java中的构造方法(2013-05-05-bd 写的日志迁移

    特点: 1.方法名和类名相同 2.没有返回值 3.在创建一个类的新对象时,系统会自动的调用该类的构造方法完成对新对象的初始化 一个类中可以定义多个不同构造方法: 如果程序员没有定义构造方法,系统能够会 ...

  7. Pandas库入门

    pandas库的series类型

  8. zeppelin之连接mysql

    上面的一篇文章,对于zeppelin的使用,只是我们对于数据存储在文件中,每一次对于当我们连接数据库的时候都会有问题,今天刚好 把这个问题解决今天我们刚好来介绍如何使用zeppelin来与数据进行连接 ...

  9. Git-Git里程碑

    里程碑即Tag,是人为对提交进行的命名.这和Git的提交ID是否太长无关,使用任何数字版本号无论长短,都没有使用一个直观的表意的字符串来得方便.例如:用里程碑名称"v2.1"对应于 ...

  10. 9,Linux下的python3,virtualenv,Mysql、nginx、redis安装配置

    常用服务安装部署   学了前面的Linux基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环境: centos7 + vmware + xshell MYSQL(mariadb) ...