Java中在进行数据排序时,Comparable和Comparator不可缺少会遇得到。普通的String、Integer等类型,已经实现了Comparable接口,而有些时候,我们须要对一些其它不存在内在排序关系的类进行排序,那么就须要实现以上两个接口,可是会有所不同。

之前搜索两者的关系。看到这样一篇文章。Comparable与Comparator的差别,里面有些说法有点太深奥,只是我来总结的话。两者最大的差别就在于假设实现Comparable,就意味着类的排序规则固定了,而假设实现Comparator,类本身是没有排序规则的,仅仅是通过制定外部规则使其进行排序,排序规则你能够指定非常多类型

那么就且来看看我做的一个样例,我们新建一个美女类(BeautyGirl)。使其具有年龄(age)、身高(height)属性,姑且依照年龄优先于身高的原则来进行排序,那么实现方式就有以下的方式。

Comparable

package com.mwq.comparable;

public class BeautyGirl implements Comparable<BeautyGirl> {
private int age;
private Double height; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Double getHeight() {
return height;
} public void setHeight(Double height) {
this.height = height;
} @Override
public int compareTo(BeautyGirl girl) {
if (this.getAge() == girl.getAge()) {
return compareHeight(girl);
} else {
return this.getAge() - girl.getAge();
}
} private int compareHeight(BeautyGirl girl) {
return girl.getHeight().compareTo(this.getHeight());
} @Override
public String toString() {
return "美女{年龄:" + this.getAge() + "身高:" + this.getHeight() + "}";
} }

实现comparable接口,就意味着须要在美女类中实现compareTo方法,也就是说,该类在排序的时候必须是年龄优先于身高。

来看看測试类

package com.mwq.comparable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Test { public static void main(String[] args) {
List<BeautyGirl> girls = new ArrayList<BeautyGirl>(); BeautyGirl girl = new BeautyGirl();
girl.setAge(28);
girl.setHeight(170.00);
girls.add(girl); girl = new BeautyGirl();
girl.setAge(25);
girl.setHeight(183.00);
girls.add(girl); girl = new BeautyGirl();
girl.setAge(28);
girl.setHeight(180.30);
girls.add(girl); girl = new BeautyGirl();
girl.setAge(32);
girl.setHeight(170.00);
girls.add(girl); girl = new BeautyGirl();
girl.setAge(21);
girl.setHeight(170.00);
girls.add(girl); for (BeautyGirl beautyGirl : girls) {
System.out.println(beautyGirl);
} Collections.sort(girls);
System.out.println("排序一下---------------------------------------------"); for (BeautyGirl beautyGirl : girls) {
System.out.println(beautyGirl);
}
} }

输出结果例如以下

美女{年龄:28身高:170.0}
美女{年龄:25身高:183.0}
美女{年龄:28身高:180.3}
美女{年龄:32身高:170.0}
美女{年龄:21身高:170.0}
排序一下---------------------------------------------
美女{年龄:21身高:170.0}
美女{年龄:25身高:183.0}
美女{年龄:28身高:170.0}
美女{年龄:28身高:180.3}
美女{年龄:32身高:170.0}

Comparator

package com.mwq.comparator;

public class BeautyGirl {
private int age;
private Double height; public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Double getHeight() {
return height;
} public void setHeight(Double height) {
this.height = height;
} @Override
public String toString() {
return "美女{年龄:" + this.getAge() + "身高:" + this.getHeight() + "}";
} }
package com.mwq.comparator;

import java.util.Comparator;

/**
* 实现美女的排序
*/
public class BeautyGirlComparator implements Comparator<BeautyGirl> { @Override
public int compare(BeautyGirl girl1, BeautyGirl girl2) {
// 姑且把年龄放在第一位
if (girl1.getAge() == girl2.getAge()) {
return compareHeight(girl1, girl2);
} else {
return girl1.getAge() - girl2.getAge();
}
} private int compareHeight(BeautyGirl girl1, BeautyGirl girl2) {
// 把身高放在第二位
return girl1.getHeight().compareTo(girl2.getHeight());
} }
Collections.sort(girls, new BeautyGirlComparator());

这样是使用排序的时候,仅仅要你指定一个新的规则,就会依照新的规则来排序,而不须要再变更BeautyGirl类。

比如。你能够依照身高优先、年龄次之的排序。

总结:两者的差别就在于排序规则的制定。假设排序规则善变。那么使用comparator是个好办法,假设规则固定,实现comparable更好,至少少写一个类。

Java Comparable和Comparator的更多相关文章

  1. Java Comparable 和 Comparator 接口详解

    本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...

  2. java Comparable and Comparator

    1.Comparable简介 此接口对实现它的每个类的对象强加一个总排序.这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法.可以通过 Collections.sort(和Ar ...

  3. java Comparable 和 Comparator接口区别

    Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实现C ...

  4. Java Comparable与Comparator区别

    1,两种接口的展示 下面的程序是两个类各自实现了Comparable接口.Comparator接口 package com.cnblogs.mufasa.Solution; import java.u ...

  5. Java comparable 和 comparator

    一.comparator 接口继承 public class ComparatorTest { /** * @param args */ public static void main(String[ ...

  6. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  7. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  8. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  9. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

随机推荐

  1. Android文档 - 账户管理器概述

    账户管理器概述 这个类提供了访问到 用户在线账户的集中式注册中心 的能力.用户为每账户输入一次 认证信息(credentials,包含用户名和密码),过过 点击一次(one-click)完成认证的方式 ...

  2. mysql 慢查询时间

    只有当一个query执行时间(不包括锁等待的时间)>long_query_time的时候,才会判定会slow log: 但是判定为slow log之后,输出包括Query_time(执行时间+锁 ...

  3. Git 提交更改

    Jerry 已经提交的更改,他想纠正他的最后一次提交,在这种情况下,git 的修改将帮助操作.最后提交修改操作的变化,包括提交信息,它创建新的提交ID. 修改操作之前,他会检查提交日志. [jerry ...

  4. OC与AS3的观察者模式比较以及外部回调

    一.要点 1.AS3的观察者模式,主要是体现在在哪个组件上监听,那么就在这个组件上分发事件,并且可以直接传递Function. 2.OC的观察者模式,主要是需要你指定观察的对象,和观察的对象方法sel ...

  5. Matlab基本用法

    转至:http://blog.sina.com.cn/s/blog_8354dda801012dyn.html 目录: 一.说明 二.数据类型及基本输入输出 三.流程控制 四.循环 五.数组.数组运算 ...

  6. 移动互联网App兼容性测试

    我建议大家也可以参考一些针对App监测和统计的网站,都非常有意义,具体如下: 友盟品牌手机排行榜  http://www.umeng.com/ 移动观象台   https://www.talkingd ...

  7. 用python读取stata文件及写入and注意事项

    读取: 由于stata没有专门模块,是从pandas里面调用,官方文档少之又少,故去查看源代码 #!/usr/bin/env python# -*- coding:utf-8 -*- from pan ...

  8. linux下时间同步的两种方法分享

    方法1:与一个已知的时间服务器同步 复制代码 代码如下: ntpdate time.nist.gov 其中 time.nist.gov 是一个时间服务器. 删除本地时间并设置时区为上海 复制代码 代码 ...

  9. 大爱HTML5 9款超炫HTML5最新动画源码

    我们分享过很多漂亮的HTML5动画,包括CSS3菜单.HTML5 Canvas动画等.今天我们精选了9款非常不错的超炫HTML5最新动画及其源码,一起来看看. 1.HTML5可爱的404页面动画 很逗 ...

  10. git解决冲突(rebase版)

    当使用git rebase碰到冲突时, git rebase <Remote Branch>/<Your Branch> 信息如下: error: Failed to merg ...