Java Comparable和Comparator
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的更多相关文章
- Java Comparable 和 Comparator 接口详解
本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...
- java Comparable and Comparator
1.Comparable简介 此接口对实现它的每个类的对象强加一个总排序.这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法.可以通过 Collections.sort(和Ar ...
- java Comparable 和 Comparator接口区别
Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”. 即然实现Comparable接口的类支持排序,假设现在存在“实现C ...
- Java Comparable与Comparator区别
1,两种接口的展示 下面的程序是两个类各自实现了Comparable接口.Comparator接口 package com.cnblogs.mufasa.Solution; import java.u ...
- Java comparable 和 comparator
一.comparator 接口继承 public class ComparatorTest { /** * @param args */ public static void main(String[ ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
随机推荐
- docker安装及加速配置
需要centos7版本,内核版本不低于3.10 [root@localhost ~]# uname -r3.10.0-514.el7.x86_64 第一步:更新当前软件:[root@localhost ...
- 使用JAAS登录kerberos服务器
java代码: package com.snsprj.jaas0822; import javax.security.auth.*; import javax.security.auth.callba ...
- css实现圆形头像
<div style="width:400px; height:90px; padding-left:10px; padding-top:10px; background-color: ...
- Android学习之ListView使用基础
1.ListView的简单用法 1.1 布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro ...
- 自然语言交流系统 phxnet团队 创新实训 个人博客 (十四)
关于WikiExtractor的学习笔记: WikiExtractor是一个Python 脚本,专门用于提取和清洗Wikipedia的dump数据,支持Python 2.7 或者 Python 3.3 ...
- JAXB解析xml
废话不多说,直接上代码 核心类: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java. ...
- BIO、NIO、AIO系列一:NIO
一.几个基本概念 1.同步.异步.阻塞.非阻塞 同步:用户触发IO操作,你发起了请求就得等着对方给你返回结果,你不能走,针对调用方的,你发起了请求你等 异步:触发触发了IO操作,即发起了请求以后可以做 ...
- Winform控件学习笔记【第二天】——常用控件
背景:期末考试刚过就感冒了,嗓子火辣辣的,好难受.但是一想起要学习总结就打起精神来了,Winform控件网上也没有多少使用教程,大部分都是自己在网上零零散散的学的,大部分用的熟了,不总结会很容易忘得. ...
- win10 .net framework 3.5无法安装错误代码0x800F081F
复制链接:http://download.windowsupdate.com/d/msdownload/update/software/updt/2015/11/microsoft-windows-n ...
- 8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向
8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向 什么是shell? shell是一个命令解释器,提供用户和及其之间的交互 致辞特定语法,比如逻 ...