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 ...
随机推荐
- JTree常用方法
private JTree jtNetDevice;//数组件申明private JScrollPane jspTree;//滚动面板申明 1.初始化 DefaultMutableTreeNo ...
- Entity Framework应用:EntityFramework DataBase First模式
在这篇文章中讲解如何使用EF的DbFirst模式实现数据的增删改查 一.新建控制台应用程序,然后右键->添加新建项,选择数据里面的实体数据模型: 然后点击添加 二.选择来自数据库的EF设计器,并 ...
- C/C++-标准输入/输出重定向为文件输入/输出
/* Time: 2017-02-22 11:11:15 Describe: C++程序将标准输入/输出重定向为文件输入/输出. */ #include <iostream> #inclu ...
- linux下安装redis并配置
redis官网上给出了安装步骤,这里做一下总结. 1.Download, extract and compile Redis with: wget http://download.redis.io/r ...
- Navi.Soft31.阅读导航
Navi.Soft31.核心类库 Navi.Soft31.WinForm框架 Navi.Soft31.WebMVC框架 Navi.Soft31.微信WinForm框架 Navi.Soft31.Mobi ...
- JAVA多线程笔试题
一.题目内容 二.我的答案 利用了线程池.考虑了超时处理.不知道这样写是否还有其他问题,或者更好更优的解决方案? import java.util.*; import java.util.concur ...
- vmrun命令
VMWare提供了vmrun与VIX API两种手段使用户可以通过程序对虚拟机进行控制. 在官方文档中给出了详细的说明和示例代码. vmrun:http://www.vmware. ...
- MYSQL查询前30条数据
, LIMIT 接受一个或两个数字参数. 参数必须是一个整数常量. 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量, 第二个参数指定返回记录行的最大数目. 初始记录行的偏移量是 (而不是 )
- c语言数据类型、运算符和表达式
数据类型 1.基本数据类型: 基本数据类型最主要的特点是,其值不可以分解为其他类型.也就是说,基本数据类型是 自我说明的 2.构造数据类型: 构造数据类型是根据已定于的一个或多个数据类型用构造的方法来 ...
- 杂乱所得之RPC【待整理】
在计算机的世界里,不仅有程序内部的通信,还需要程序之间的通信,这又包含两大类:同一台主机的程序之间的通信.不同主机的程序之间的通信. 同一台主机的程序之间的通信就是IPC,IPC(Inter-proc ...