首页 技术 正文
技术 2022年11月17日
0 收藏 417 点赞 5,172 浏览 3104 个字

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更好,至少少写一个类。

下一篇: Maven是什么?
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,903
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,429
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,245
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,057
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,689
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,726