对于存储在集合里的自定义对象,要想对它们进行排序,我们只需要让它们实现相应的比较接口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`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...
例如,当我们有一个自定义类的集合,并且需要按照多种方式进行排序时,可以先让类实现Comparable接口,表示其默认的排序规则,然后在需要其他排序规则时,创建Comparator实例并传递给Collections.sort()或者TreeSet...
而Comparator接口的排序是局部的,即在每个特定的排序操作中,可以根据需要创建不同的Comparator实例,实现多种排序策略。 在实际开发中,Comparable接口通常用于那些有固定排序规则的类,比如日期、数字等。而...
在Java编程语言中,排序是常见的操作,而`Comparable`和`Comparator`接口则是实现对象排序的两种主要方式。这篇文章将深入探讨这两种实现方式及其在实际编程中的应用。 首先,`Comparable`接口位于`java.lang`包下...
通过传入Comparator实例,我们可以控制这些数据结构内部的排序逻辑。 总结来说,Comparable接口用于那些希望具备默认排序规则的类,通常由类自身实现,确保所有该类的实例都能按照某种规则比较。而Comparator接口则...
在Java编程语言中,`Comparable`接口和`Comparator`接口是两种重要的排序机制,它们用于对集合中的对象进行比较和排序。理解它们的区别对于任何Java开发者来说都是至关重要的。 首先,`Comparable`接口位于`java....
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
在 Java 中,Comparator 和 Comparable 是两个非常重要的接口,它们用于对象的排序操作。这两个接口都是在 java.util 包中定义的,主要用于定制排序规则。 **一、Comparator 接口** Comparator 接口允许我们创建...
在Java编程语言中,Comparable和Comparator接口用于对对象进行比较和排序。这两个接口在很多情况下都能派上用场,但它们的应用场景和实现方式有所不同。 首先,Comparable接口是排序接口,意味着一个类如果实现了...
Comparable 接口和 Comparator 使用示例 在 Java 编程语言中,比较和排序是非常...Comparable 接口和 Comparator 都是 Java 中非常重要的比较和排序机制,它们提供了不同的比较和排序方式,分别适用于不同的应用场景。
我们使用了Collections.sort方法,并传递了一个匿名内部类的Comparator实例来对列表进行排序。在Comparator的compare方法中,我们首先比较了年龄属性,如果年龄相同,则比较姓名属性。最终,程序打印出排序前后的...
在实际使用时,我们可以将Comparator实例传递给Collections.sort()或Arrays.sort()方法,实现自定义排序: ```java LinkedList<Person> al = new LinkedList(); // 添加Person对象... Collections.sort(al, new ...
在需要排序时,你需要同时提供对象列表和相应的Comparator实例,如`Collections.sort(personList, new PersonComparator())`。 Comparable接口的优点在于它简化了代码,因为你不需要每次都传递比较器。但是,它可能...
Java中的`sort`排序算法是Java集合框架的重要组成部分,主要用于对List接口的实现类进行排序。这个算法在Java中主要体现在`java.util.Arrays`和`java.util.Collections`两个类中,提供了对数组和集合的排序功能。...
本实例将探讨如何利用LinkedList以及比较器Comparator实现一个自定义排序的人事信息系统。 首先,我们需要创建一个表示人事信息的类,例如`Employee`,它包含姓名(name)、年龄(age)、身高(height)和职称...
如果需要自定义排序规则,可以提供一个`Comparator`实例给`Collections.sort()`方法。`Comparator`是一个接口,定义了`compare()`方法用于比较两个对象。例如,我们创建一个`ComparatorPerson`类来根据姓名排序: `...
下面我们将深入探讨如何在Java中实现集合的分组与排序。 1. **集合分组**: 集合分组通常涉及到`GroupingBy`操作,这在Java 8引入的流(Stream)API中得到了很好的支持。`Collectors.groupingBy`方法允许我们将...
7. **Comparable与Comparator的区别** `Comparable`是对象本身实现的接口,用于定义默认的排序规则。而`Comparator`是外部对象实现的接口,用于提供定制的排序规则。一个类可以同时实现`Comparable`和`Comparator`...