对于存储在集合里的自定义对象,要想对它们进行排序,我们只需要让它们实现相应的比较接口java.lang.Comparable,并且实现里面的比较方法compareTo(Object o),这个方法
会有一个整数型的返回值,如果返回值大于0就表示当前的对象应该排在方法中传过来的对象的前面,如果返回值小于0就表示当前的对象应该排在方法中传过来的对象的后面,如
果返回0就表示两个对象并列。然后我们只要调用公共类库中java.util.Collections这个类的sort(List list)方法,Java就会按照它的一套方法对list集合里面的对象排列先后次
序。现在我们通过CompObj.java代码来了解一下自定义对象的排序是如何实现的。
import java.util.ArrayList;
import java.util.Collections;
public class CompObj implements Comparable {
int x;
int y;
public CompObj(int n1, int n2) {
x = n1;
y = n2;
}
//打印该对象时会自动调用toString方法
public String toString() {
return "[x = " + x + ", y = " + y + "]";
}
//复写Comparable中的方法
//定义比较规则,使CompObj对象可以互相比较
public int compareTo(Object o) {
//注意把传入的参数转化成当前类型的对象
CompObj co=(CompObj)o;
if(x!=co.x) {
return x-co.x;
}else{
return y-co.y;
}
}
public static void main(String[] args) {
ArrayList l=new ArrayList();
l.add(new CompObj(3,2));
l.add(new CompObj(1,3));
l.add(new CompObj(1,2));
System.out.println("before sort");
for(int i=0;i<l.size();i++){
System.out.println(l.get(i));
}
Collections.sort(l);
System.out.println("after sort");
for(int i=0;i<l.size();i++){
System.out.println(l.get(i));
}
}
}
对于自定义的类CompObj,我们把它的一组对象存放在ArrayList里面,并且对它们进行排序。为了Collections.sort()方法可以正常运转,我们为CompObj这个类在compareTo
(Object o)方法中定义了比较规则,因为sort()方法会去调用每个对象的compareTo()方法。这里我们定义的比较规则是:x值小的对象排在前面,如果x值相同那么y值小的对象排
在前面。下面输出的结果:
before sort
[x = 3, y = 2]
[x = 1, y = 3]
[x = 1, y = 2]
after sort
[x = 1, y = 2]
[x = 1, y = 3]
[x = 3, y = 2]
根据我们的规则Collections.sort()方法做出了相应的排序,大家可以改变一下比较规则看看输出结果会有什么样的变化。
3.6.2 为你的对象定义比较器
在现实生活中我们会遇到这样一个问题就是同样一种类型的对象之间可能会按着不同的规则进行排序。比如说上面的例子中我们先比较x值的大小再比较y值的大小,那么如果我想
先比较y值的大小再比较x值的大小怎么办呢?
Java里面给我们提供了一个比较器java.util.Comparator,我们只要在比较器中定义它所比较的两个对象之间的比较规则即可。然后同样调用公共类库中java.util.Collections这
个类的sort(List list, Comparator c)方法,唯一的区别就是这个方法中多了一个比较器Comparator这个参数。让我们通过ObjComparator.java来了解一下是如何通过比较器实现
集合里的对象排序的。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class ObjComparator implements Comparator{
public int compare(Object o1,Object o2) {
//注意把传入的参数转化成当前类型的对象
CompObj1 co1=(CompObj1)o1;
CompObj1 co2=(CompObj1)o2;
if(co1.y!=co2.y) {
return co1.y-co2.y;
}else {
return co1.x-co2.x;
}
}
}
public class CompObj1 {
int x;
int y;
public CompObj1(int n1, int n2) {
x = n1;
y = n2;
}
//打印该对象时会自动调用toString方法
public String toString(){
return "[x = " + x + ", y = " + y + "]";
}
public static void main(String[] args) {
ArrayList l=new ArrayList();
l.add(new CompObj1(3,2));
l.add(new CompObj1(1,3));
l.add(new CompObj1(1,2));
System.out.println("before sort");
for(int i=0;i<l.size();i++){
System.out.println(l.get(i));
}
Collections.sort(l,new ObjComparator());
System.out.println("after sort");
for(int i=0;i<l.size();i++){
System.out.println(l.get(i));
}
}
}
需要注意的是我们自定义的对象CompObj1根本不用实现什么java.uitl. Comparable接口,我们只要定义一个针对于该对象的比较器就可以完成排序的功能,这么做带来的好处就是
,不仅可以针对一个类型的对象按着多种比较规则进行排序,而且我们完全的把对象的比较规则从对象的业务逻辑中抽离出来,达到了各司其职的目的。
分享到:
相关推荐
java排序Comparator和Comparable
Java中Comparable和Comparator的区别共3页.pdf.zip
主要介绍了java 中Comparable与Comparator详解与比较的相关资料,需要的朋友可以参考下
详细的介绍了Java中Comparable与Comparator的区别
本文,先介绍Comparable 和Comparator两个接口,以及它们的差异;接着,通过示例,对它们的使用方法进行说明
Comparable与Comparator的区别Java开发Java经验技巧共3页.pdf.zip
java中Comparable和Comparator的区别 简介 java.lang.Comparable和java.util.Comparator是两个容易混淆的接口,两者都带有比较的意思,那么两个接口到底有什么区别,分别在什么情况下使用呢? Comparable Comparable...
Comparable&Comparator区别,看完就明白了
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
Comparable和Comparator接口都可用作普通意义上对象间的比大小,但两个接口在实例化方面的用法不尽相同,接下来我们就来详细对比Java中的Comparable排序接口和Comparator比较器接口
主要介绍了详解Java中Comparable和Comparator接口的区别的相关资料,希望通过本文大家能彻底掌握这部分内容,需要的朋友可以参考下
java的Comparator和Comparable
主要介绍了Java Comparable和Comparator对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
NULL 博文链接:https://gghaomm.iteye.com/blog/1753970
所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。 2.实现什么方法 int ...
Java-中的-Comparator-和-Comparable.md
主要介绍了Java Comparable 和 Comparator 的详解及区别的相关资料,Comparable 自然排序和Comparator 定制排序的实例,需要的朋友可以参考下
主要介绍了Java 比较接口comparable与comparator区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要针对Java中Comparable和Comparator对象进行比较,感兴趣的小伙伴们可以参考一下