在开发过程中我们经常会遇到集合里的对象进行相应排序这种需求,对于这些乱序对象的排序我们最重要的就是做两件事情:第一,如何确定两个对象之间的大小关系;第二,依据怎样的方法对现有的对象排列。非常幸运的是,在Java程序语言里面已经给出了我们如何对一组已知大小关系的对象进行排列的解决方案,我们要做的就是完成第一件事情,即确定对象之间的大小关系,也就是说我们要想按着Java的方法对一组对象进行排列的话,我们就必须要保证这组对象是能够互相比较的。因此可以说我们指定比较规则确定对象的大小,Java提供排列方法进行高效排序。
3.6.1 让你的对象是可比较的
对于存储在集合里的自定义对象,要想对它们进行排序,我们只需要让它们实现相应的比较接口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接口,我们只要定义一个针对于该对象的比较器就可以完成排序的功能,这么做带来的好处就是,不仅可以针对一个类型的对象按着多种比较规则进行排序,而且我们完全的把对象的比较规则从对象的业务逻辑中抽离出来,达到了各司其职的目的。
以下是该程序的输出结果:
before sort
[x = 3, y = 2]
[x = 1, y = 3]
[x = 1, y = 2]
after sort
[x = 1, y = 2]
[x = 3, y = 2]
[x = 1, y = 3]
分享到:
相关推荐
在本篇中,我们将深入探讨Java集合的排序机制以及集合类的详细使用。 首先,我们来了解一下Java集合的基本分类。Java集合主要分为两大类:List(列表)和Set(集)。List是一个有序的集合,允许元素重复,并且可以...
Java 集合排序及java 集合类详解 Java 集合排序及java 集合类详解,Java里面最重要、最常用也就是集合那部分了,能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本教程详细解释了关于Java中的集合是...
Java集合排序及java集合类详解.pdf
Java集合框架中的`List`接口和数组(Array)是两种常用的数据结构,它们在处理数据时各有优势。下面我们将深入探讨如何在Java中实现集合的分组与排序。 1. **集合分组**: 集合分组通常涉及到`GroupingBy`操作,这...
Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等...
Java集合排序及java集合类详解(Collection、List、Map、Set).doc
本文将结合上述 Bloch 关于线程安全等级的定义,对 Java 集合框架中的集合类进行线程安全性分析,并指出各个集合类在现实的编程环境中需要注意的并发编程的陷阱;同时对集合框架中通用算法对线程安全性的影响进行...
Java集合某个字段按照中文拼音排序是Java开发中经常遇到的问题。对Java集合中的某个字段按照中文拼音排序可以使用多种方法,本文将介绍两种常见的方法。 方法一:使用Comparable接口 在Java中,我们可以使用...
java 集合排序及java集合类详解,本文详细解释了关于java中的集合实现,以及他们的实现原理
本文将对Java集合框架中的Collection接口及其相关接口、类进行深入的探讨。 首先,Collection接口是所有单值容器的基础,它是Set、List和Queue接口的父接口。Collection接口定义了通用的操作方法,如`add()`用于...
Java集合类是Java编程语言中用于存储和管理对象的关键组件,它们构成了Java Collections Framework的核心。这个框架提供了一组高效、灵活的数据结构,使得开发者能够轻松地处理数据集合,而无需关心底层实现的复杂性...
自定义集合类则是开发者根据特定需求扩展Java集合框架的行为,以满足个性化或特定业务场景的功能需求。以下是对"java自定义集合类"这一主题的详细解释。 首先,Java集合框架包括接口(如List、Set、Map)和实现这些...
集合类的框架为集合的实现者提供了大量的接口和抽象类,并对其中的某些机制给予了描述,例如,Iterator(迭代协议)。实现Comparable接口或Comparator接口,用户可以根据需要对集合中的元素进行排序。为了方便用户...
Java集合类是Java语言中用来存储数据的结构,它们是Java开发中非常重要的组件。在Java 2平台之前,集合框架的组成较为零散,自Java 2平台的JDK 1.2版本之后,引入了集合框架(Collections Framework),为集合类提供...