博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Comparable和Comparator有啥不一样
阅读量:2428 次
发布时间:2019-05-10

本文共 5392 字,大约阅读时间需要 17 分钟。

1.Comparable和Comparator对比

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”,这时调用该类的排序方法时就可以实现排序。

Comparable位于java.lang包下。具体定义如下:

public interface Comparable
{
/** ** 返回值: ** 0 => this对象与对象o相等 ** 大于0 => this对象大于对象o ** 小于0 => this对象小于对象o **/ public int compareTo(T o);}

Comparator 是一个专用的比较器,在集合外部实现排序,当这个对象不支持自比较或者自比较函数不能满足要求时就可以写一个比较器来完成两个对象之间大小的比较。

Comparator位于java.util包下。具体定义如下:

public interface Comparator
{
/** ** 返回值: ** 0 => o1 = o2 ** 大于0 => o1 > o2 ** 小于0 => o1 < o2 **/ int compare(T o1, T o2);}

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

2. Comparable和Comparator排序案例

场景一:假设每个学生有4个属性:id,姓名,年龄,成绩。现在需要根据id来进行排序,先使用Comparable实现。

Student.java

public class Student implements Comparable
{
private String id; private String name; private int age; private Double score; public Student(String id, String name) {
this(id,name,0,0); } public Student(String id, String name, int age, double score){
this.id = id; this.name = name; this.age = age; this.score = score; } public String getId() {
return id; } public void setId(String id) {
this.id = id; } 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; } public Double getScore() {
return score; } public void setScore(Double score) {
this.score = score; } /** * 根据id排序 * @param o * @return */ @Override public int compareTo(Student o) {
return this.id.compareTo(o.id); } @Override public String toString() {
String info = new String(); info = id + '\t' + name + '\t' + age + '\t' + score + '\n'; return info; }}

StudentComparableTest.java

public class StudentComparableTest {
public static void main(String[] args) {
List
list = new ArrayList
(); list.add(new Student("00001", "a", 20, 90 )); list.add(new Student("00007", "b", 19, 95 )); list.add(new Student("00004", "c", 21, 94 )); list.add(new Student("00003", "d", 20, 92 )); Collections.sort(list); System.out.println("Comparable按序号排序后:"); System.out.println("学号" + "\t姓名" + "\t年龄" + "\t成绩"); for (Student student : list) {
System.out.print(student); } }}

运行结果:

Comparable按序号排序后:学号	姓名	年龄	成绩00001	a	20	90.000003	d	20	92.000004	c	21	94.000007	b	19	95.0

场景二:现需要按照姓名和成绩两个维度对学生进行排名,如果还是实现Comparable则需要重写Student类,那么有没有办法不重写呢,答案当然是有的,这就是Comparator。

StudentComparatorTest.java

public class StudentComparatorTest {
public static void main(String[] args) {
List
students = new ArrayList
(); students.add(new Student("00001", "a", 20, 98 )); students.add(new Student("00007", "b", 19, 95 )); students.add(new Student("00004", "c", 21, 94 )); students.add(new Student("00003", "d", 20, 92 )); // 按姓名升序排序 Collections.sort(students, new ComparatorWithNameUP()); // 显示学生信息 System.out.println("按姓名升序排序结果:"); System.out.println("学号" + "\t姓名" + "\t年龄" + "\t成绩"); for (int i = 0; i < students.size(); i++) {
System.out.print(students.get(i)); } // 按姓名降序排序 Collections.sort(students, new ComparatorWithNameDown()); // 显示学生信息 System.out.println("按姓名降序排序结果:"); System.out.println("学号" + "\t姓名" + "\t年龄" + "\t成绩"); for (int i = 0; i < students.size(); i++) {
System.out.print(students.get(i)); } // 按成绩降序排序 Collections.sort(students, new ComparatorWithScoreDown()); // 显示学生信息 System.out.println("按成绩降序排序结果:"); System.out.println("学号" + "\t姓名" + "\t年龄" + "\t成绩"); for (int i = 0; i < students.size(); i++) {
System.out.print(students.get(i)); } // 按成绩升序排序 Collections.sort(students, new ComparatorWithScoreUp()); // 显示学生信息 System.out.println("按成绩升序排序结果:"); System.out.println("学号" + "\t姓名" + "\t年龄" + "\t成绩"); for (int i = 0; i < students.size(); i++) {
System.out.print(students.get(i)); } }}// 按姓名进行升序排序的外部类,用Comparator接口class ComparatorWithNameUP implements Comparator
{
@Override public int compare(Student arg0, Student arg1) {
return arg0.getName().compareTo(arg1.getName()); }}// 按姓名进行降序排序的外部类,用Comparator接口class ComparatorWithNameDown implements Comparator
{
@Override public int compare(Student arg0, Student arg1) {
return arg1.getName().compareTo(arg0.getName()); }}// 按成绩降序class ComparatorWithScoreDown implements Comparator
{
@Override public int compare(Student arg0, Student arg1) {
if (arg1.getScore() > arg0.getScore()) return 1; else {
if (arg1.getScore() == arg0.getScore()) return 0; else return -1; } }}// 按成绩升序class ComparatorWithScoreUp implements Comparator
{ @Override public int compare(Student arg0, Student arg1) { if (arg0.getScore() > arg1.getScore()) return 1; else { if (arg0.getScore() == arg1.getScore()) return 0; else return -1; } }}

运行结果:

按姓名升序排序结果:学号	姓名	年龄	成绩00001	a	20	98.000007	b	19	95.000004	c	21	94.000003	d	20	92.0按姓名降序排序结果:学号	姓名	年龄	成绩00003	d	20	92.000004	c	21	94.000007	b	19	95.000001	a	20	98.0按成绩降序排序结果:学号	姓名	年龄	成绩00001	a	20	98.000007	b	19	95.000004	c	21	94.000003	d	20	92.0按成绩升序排序结果:学号	姓名	年龄	成绩00003	d	20	92.000004	c	21	94.000007	b	19	95.000001	a	20	98.0

转载地址:http://mecmb.baihongyu.com/

你可能感兴趣的文章
利用序列化实现对象的拷贝
查看>>
is-a,has-a,like-a是什么
查看>>
简单工厂、工厂、抽象工厂的对比
查看>>
J2EE的体系架构——J2EE
查看>>
对于关系型数据库中的索引的基本理解
查看>>
索引,主键,唯一索引,联合索引的区别
查看>>
剪桌腿的最小代价
查看>>
Zookeeper原理架构
查看>>
利用ZooKeeper简单实现分布式锁
查看>>
Lock、ReentrantLock、synchronized
查看>>
Java过滤器与SpringMVC拦截器之间的关系与区别
查看>>
Java中的String为什么是不可变的?
查看>>
剑指offer二叉搜索树与双向链表
查看>>
LeetCode 81. 搜索旋转排序数组 II(头条)
查看>>
LC 42. 接雨水 + LC 11. 盛最多水的容器
查看>>
腾讯2017 秋招+暑期实习 笔试(编码;构造回文;字符移位;有趣的数字)
查看>>
LC 901. 股票价格跨度 LC 739. 每日温度
查看>>
【Redis深入】字典rehash图解
查看>>
java equals方法和hashCode方法
查看>>
Redis的底层数据结构(6种)
查看>>