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. php用正则表达式获取网站的标题内容

    已知网站的网址,用php获取网站的内容. 编写正则表达式. 用preg_match_all函数获取标题内容. $url='http://www.m-ivi.com'; $content=file_ge ...

  2. 、Dll文件的编写 调用 说明

    1>新建Dll文件TestLib.dll 新建Unit文件U_TestFunc U_TestFunc代码如下: unit U_TestFunc; interface uses //尽可能的少us ...

  3. 对于python WSGI的理解

    首先看看WSGI的目的是什么? 是用来定义一个统一的接口. 这个接口是针对Web服务器和python Web应用之间的. 以增加Python web应用在不同Web 服务器之间的可移植性. 也就是说如 ...

  4. zoom 用法

    from: http://www.jb51.net/css/40285.html 其实Zoom属性是IE浏览器的专有属性,Firefox等浏览器不支持.它可以设置或检索对象的缩放比例.除此之外,它还有 ...

  5. HBASE的安装

    HBASE的安装: 安装的软件版本:hbase-0.98.4-hadoop2.tar.gz 下载链接:http://www.apache.org/dist/hbase/hbase-0.98.4/ 1. ...

  6. 移动端Reactive Native轮播组件

    移动端Reactive Native轮播组件 总结下这段时间学习reactive native的一些东西,我们来认识一下,被炒得这么火的rn,究竟是个什么东西,以及如何去搭建自己的demo. reac ...

  7. Automotive Security的一些资料和心得(2):Cryptography

    1. Security Goal - Confidentiality - Integrity - Availability - Authenticity - Non-repudiation - Aut ...

  8. 1091-Black Vienna

    描述 This problem is based on the game of Black Vienna. In this version there are three players and 18 ...

  9. mysql 监控工具monyog使用总结

    1. 下载安装 2. 登录之后,查看 locked queries 2. 慢查询

  10. [状压dp]HDOJ4539 郑厂长系列故事——排兵布阵

    中文题,题意不再赘述 对于“?”这一格,它所能攻击到的(曼哈顿距离为2的) 前方的 即“√”的四个位置 那么与此格有关的即它前方两行(即状压这两行) 首先预处理每行能满足的: i 和(i<< ...