Comparable和Comparator的学习笔记
今天在项目开发中,遇到要对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的学习笔记的更多相关文章
- Java Comparator接口学习笔记
		Comparator是一个泛型函数式接口,T表示待比较对象的类型: @FunctionalInterface public interface Comparator<T> { } 本文将主 ... 
- java学习笔记13--比较器(Comparable、Comparator)
		java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ... 
- 《Java学习笔记(第8版)》学习指导
		<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ... 
- 20145330第五周《Java学习笔记》
		20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ... 
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
		前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ... 
- JavaSE中Map框架学习笔记
		前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ... 
- Java8——快速入门手册(学习笔记)
		github博文传送门 Java8特性学习笔记 Java8中新增了许多的新特性,在这里本人研究学习了几个较为常用的特性,在这里与大家进行分享.(这里推荐深入理解Java 8用于理解基础知识)本文分为以 ... 
- javaSE学习笔记(10)---List、Set
		javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ... 
- JavaSE 学习笔记01丨开发前言与环境搭建、基础语法
		本蒟蒻学习过C/C++的语法,故在学习Java的过程中,会关注于C++与Java的区别.开发前言部分,看了苏星河教程中的操作步骤.而后,主要阅读了<Java核心技术 卷1 基础知识>(第8 ... 
随机推荐
- 第10章 	新建工程-库函数版—零死角玩转STM32-F429系列
			第10章 新建工程—库函数版 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ... 
- 带有data-ng-bind表达式
			<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ... 
- ipython notebook超级好用
			这个东西超级好用,以后要以c++和python为主要沟通语言了. 
- css3 子元素的的应用 注意点
			已经第二次犯错误,不允许有下次 <ul class="ul"> <li> <a>哈哈</a> </li> <li& ... 
- background和background-image一点小区别
			如果使用background-image属性,则no-repeat不能使用,因为其对background-image不起作用. 可以使用background属性,再设置no-repeat. 
- 用FileReader对象获取图片base64代码并预览
			MDN中FileReader的详细介绍: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader 用FileReader获取图片base ... 
- pdo->prepare 返回false的问题总结
			报错信息: Fatal error: Call to a member function execute() on a non-object 一般是pdo->prepare 返回了false导致 ... 
- .NET向WebService传值为decimal、double、int、DateTime等非string类型属性时,服务器端接收不到数据的问题
			最近在做CRM项目时,使用C#调用SAP PI发布的WebService服务时遇到的问题: 向WebService传值为decimal.double.int.DateTime等非string类型数据时 ... 
- Linux下常用压缩 解压命令与压缩比率对比
			常用的格式有:tar, tar.gz(tgz), tar.bz2, 不同方式,压缩和解压方式所耗CPU时间和压缩比率也差异也比较大. 1. tar只是打包动作,相当于归档处理,不做压缩:解压也一样,只 ... 
- java的八种基本数据类型
			据说表格的方式一目了然 一. java数据类型的取值范围如下: 注意:long型后如果不加 L 则默认为int型,float型如果不加 F 则默认为double型: 注意!注意!注意 ... 
