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}