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 ...
随机推荐
- 微信怎样做SEO
微信也能做SEO.大家还不知道吧?今天上海SEO优化公司就和大家解说在微信上要怎么做SEO优化. 微信也有SEO?你会不会觉得我是说笑呢.事实上还就是.我也找不到什么好名词来介绍公众号上的排名,就用微 ...
- jQuery源代码解析(3)—— ready载入、queue队列
ready.queue放在一块写,没有特殊的意思,仅仅是相对来说它俩可能源代码是最简单的了.ready是在dom载入完毕后.以最高速度触发,非常实用. queue是队列.比方动画的顺序触发就是通过默认 ...
- TF-IDF词项权重计算
一.TF-IDF 词项频率: df:term frequency. term在文档中出现的频率.tf越大,词项越重要. 文档频率: tf:document frequecy.有多少文档包括此term, ...
- Java 将图片转二进制再将二进制转成图片
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...
- PCL深度图像(1)
目前深度图像的获取方法有激光雷达深度成像法,计算机立体视觉成像,坐标测量机法,莫尔条纹法,结构光法等等,针对深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基 ...
- spring security笔记
当指定http元素的auto-config=”true”时,就相当于如下内容的简写. <security:http> <security:form-login/> <se ...
- Ubuntu下的OpenResty 安装
安装前的准备 您必须将这些库 perl 5.6.1+, libreadline, libpcre, libssl安装在您的电脑之中. 对于 Linux来说, 您需要确认使用 ldconfig 命令,让 ...
- How to install SharePoint 2013 on Windows Server 2012 R2
[Update 26.02.2014] Many thanks to everybody commented on this post. As Falk already mentioned in th ...
- Android 扩大view点击范围
Android4.0设计规定的有效可触摸的UI元素标准是48dp,转化为一个物理尺寸约为9毫米.7~10毫米,这是一个用户手指能准确并且舒适触摸的区域. 如下图所示,你的UI元素可能小于48dp,图标 ...
- 初试PyOpenGL二 (Python+OpenGL)基本地形生成与高度检测
在上文中,讲述了PyOpenGL的基本配置,以及网格,球形的生成,以及基本的漫游.现在利用上一篇的内容,来利用高程图实现一个基本的地形,并且,利用上文中的第三人称漫游,以小球为视角,来在地形上前后左右 ...