1.知识点了解

Comparator和Comparable都是用用来实现集合中元素的比较、排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排序

相同点:

二者的比较方法Comparable的compareTo和compare返回的结果有三种负数、零、正数,分别表示的关系为小于、等于、大于

不同点:

Comparator位于java.util包下,属于Collection的一员;Comparable位于java.lang包下

Comparable是一个内部比较器,实现该接口的对象相当于具有了排序的能力;Comparator是一个外部比较器,可以将两个没有实现排序的对象实现Comparator接口来实现排序,内部与外部是相对于排序代码是否在实现的排序的对象中实现的

Comparator接口中的方法如下:

Comparable中的方法如下所示:

建议Comparator实现java.io.Serializable接口从而序列化,因为它们经常在序列化后的TreeSet、TreeMap等数据结构中使用;equals方法经常被重写来比较引用对象是否是同一个;

2.实际应用

实现按照学生的年龄从小到大、如果年龄相等,则按照姓名的字典排序

2.1 通过Comparator外部比较器来实现排序

Student类:

 public class Student {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Student(String name, Integer age){
this.name=name;
this.age=age;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

Comparator实现排序类:

 /**
* 实现按照学生的年龄从小到大、如果年龄相等,则按照姓名的字典排序
*/
public class StudentCompartor implements Comparator<Student> { @Override
public int compare(Student s1, Student s2) {
return (s1.getAge()-s2.getAge()==0)?(s1.getName().compareTo(s2.getName())):(s1.getAge()-s2.getAge());
}
public static void main(String[] args){
StudentCompartor pc = new StudentCompartor();
Student p1=new Student("zhangsan",20);
Student p2=new Student("lisi",25);
Student p3=new Student("zhangsan",25);
if(pc.compare(p1,p2)<0){
System.out.println(p1);
System.out.println(p2);
}else{
System.out.println(p2);
System.out.println(p1);
}
//两者年龄相等,按照姓名排序
if(pc.compare(p2,p3)<0){
System.out.println(p2);
System.out.println(p3);
}else{
System.out.println(p3);
System.out.println(p2);
}
}
}

运行结果:

2.2通过Comparable内部比较器来实现排序

Student类:实现了Comparable接口

 public class Student implements Comparable<Student> {
private String name;
private Integer age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} Student(String name, Integer age) {
this.name = name;
this.age = age;
} @Override
public int compareTo(Student s2) {
return (this.getAge() - s2.getAge() == 0) ? (this.getName().compareTo(s2.getName()))
: (this.getAge() - s2.getAge());
} @Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}

内部比较器Comparable实现的排序:

 /**
* 实现按照学生的年龄从小到大、如果年龄相等,则按照姓名的字典排序
*/
public class StudentComparable {
public static void main(String[] args) {
Student p1 = new Student("zhangsan", 20);
Student p2 = new Student("lisi", 25);
Student p3 = new Student("zhangsan", 25);
if (p1.compareTo(p2) < 0) {
System.out.println(p1);
System.out.println(p2);
} else {
System.out.println(p2);
System.out.println(p1);
}
// 两者年龄相等,按照姓名排序
if (p2.compareTo(p3) < 0) {
System.out.println(p2);
System.out.println(p3);
} else {
System.out.println(p3);
System.out.println(p2);
}
}
}

运行结果同上所示。

【原】Comparator和Comparable的联系与区别的更多相关文章

  1. Comparator与Comparable用法与区别

    一.概述.   Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...

  2. 集合排序 Comparator和Comparable的使用区别

    Java 排序 Compare  Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...

  3. 接口Comparator和Comparable的区别和联系

    1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Pe ...

  4. Java基础之comparator和comparable的区别以及使用

    Java基础之comparator和comparable的区别以及使用 1: 区别:  .Comparable类需要实现此接口,定义在类内,不利于扩展 2 .Comparator更灵活,可以随时自定义 ...

  5. 玩转 Comparator 和 Comparable 两接口

    最近项目中有排序的需求,就查看了一下Java文档,发现有两个接口都可以进行排序,Comparable 和 Comparator 两接口到底有啥区别?何时用?怎么用?使用场景我都在底下一一研究分享出来: ...

  6. java之Comparator与Comparable

    转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...

  7. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  8. 关于Comparator和Comparable的理解

    我们都知道,实现Comparator和Comparable这两个接口,可以实现对对象比较大小.那这个两个又有什么区别呢? comparator 1.接口类在java.util包里面,实现接口时需要导入 ...

  9. Comparable和Compartor的区别

    1.List对象实现Comparable接口,使对象具备可比性 package tao; import java.util.ArrayList; import java.util.Collection ...

随机推荐

  1. Winfrom 中 ComboBox 绑定数据后设置选定项问题

    在为 ComboBox 当定数据的时候,如果遇到界面显示需要用文本,而获取选定项的值时需要用数字,我们就很习惯使用 DataSource  来进行绑定. 例如以下代码: List<TextVal ...

  2. PHP的PSR-0命名标准

    PSR是Proposing a Standards Recommendation(提出标准建议)的缩写,是由PHP Framework Interoperability Group(PHP通用性框架小 ...

  3. Python之路----文件操作

    文件操作 1.能调用方法的一定是对象,比如数值.字符串.列表.元组.字典,甚至文件也是对象,Python中一切皆为对象. str1 = 'hello' str2 = 'world' str3 = ' ...

  4. sbrk and coreleft

    一.sbrk 函数来源:TC2.0.Linux 函数名: sbrk 功 能: 增加程序可用数据段空间,增加大小由参数 incr决定 . 返回值:函数调用成功返回一指针,指向新的内存空间.函数调用失败则 ...

  5. Wix 安装部署(一)同MSBuild 自动生成打包文件 转

    原文地址:http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不 ...

  6. 【win8技巧】win8一键截图自动保存到文件夹

    以前截图都是按着键盘的PrtSc键,但是这个只是保存到剪贴板,还需要粘贴才行. 现在win8可以直接使用 Win + PrtSc 进行全屏截图,不仅保存到剪贴板,而且自动保存到[库]--[图片]--[ ...

  7. Ubuntu 14.04 开启启动器图标最小化功能

    转自Ubuntu 14.04 怎样开启启动器图标最小化功能 前本站报道过 Ubuntu 14.04 终于加入了启动器图标最小化功能,这个功能默认是不开启的,要怎么开启呢? 之前报道的原文阅读:Ubun ...

  8. Power Designer 使用技巧总结

    1.设置主键自增 在表的属性界面---选择column---双击主键: 2. 为脚本添加注释: 在表的属性界面---选择column分别进行下列设置:

  9. easyui源码翻译1.32--ComboBox(下拉列表框)

    前言 扩展自$.fn.combo.defaults.使用$.fn.combobox.defaults重写默认值对象.下载该插件翻译源码 下拉列表框显示一个可编辑文本框和下拉式列表,用户可以选择一个值或 ...

  10. Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

    文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...