一、描述
自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序。
这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序。
另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,在调用Arrays的sort()时将排序类对象作为参数传入:public static void sort(T[] a,Comparatorc),根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何 e1 和 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。
优点是可以按照多种方式排序,你要按照什么方式排序,就创建一个实现Comparator接口的排序方式类,然后将该排序类的对象传入到Arrays.sort(待排序对象,该排序方式类的对象)
二、源代码
方式1:使用Comparable接口
package tong.day4_27.systemUse; import java.util.Arrays; /** * 使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法 * 缺点是只能按照一种规则排序 * @author tong * */ public class ObjectSort { public static void main(String[] args) { Person[] persons = new Person[5]; persons[0] =new Person("tom",45); persons[1] =new Person("jack",12); persons[2] =new Person("bill",21); persons[3] =new Person("kandy",34); persons[4] =new Person(); Arrays.sort(persons); for (Person person:persons) { System.out.println(person); } } } class Person implements Comparable{ private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; } public Person(){ this("unknown", 0); } //重写该类的compareTo()方法,使其按照从小到大顺序排序 @Override public int compareTo(Person o) { return age-o.age; } //重写Student类的toString()方法,在输入对象时按照以下方式输出 @Override public String toString() { return "Person[name:"+name+",age:"+age+"]"; } }
运行结果:
方式2:使用Comparator接口
package tong.day4_27.systemUse; import java.util.Arrays; import java.util.Comparator; /** * 使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法 * public static void sort(T[] a,Comparator c),根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的 * (也就是说,对于数组中的任何 e1 和 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。 * 优点是可以按照多种方式排序,你要按照什么方式排序,就创建一个实现Comparator接口的排序方式类,然后将该排序类的对象传入到Arrays.sort(待排序对象,该排序方式类的对象) * @author tong * */ public class ComparatorUse { public static void main(String[] args) { Student[] persons = new Student[5]; persons[0] =new Student("tom",1,88,45); persons[1] =new Student("jack",6,80,12); persons[2] =new Student("bill",4,68,21); persons[3] =new Student("kandy",2,98,34); persons[4] =new Student("lily",5,94,20); System.out.println("排序前的数据:"); for (Student student:persons) { System.out.println(student); } //创建SortByNumber对象,将其作为参数传入Arrays.sort(persons,sortByNumber)方法中 SortByNumber sortByNumber = new SortByNumber(); Arrays.sort(persons,sortByNumber); System.out.println("根据学生编号由低到高排序:"); for (Student student:persons) { System.out.println(student); } SortByScore sortByScore = new SortByScore(); Arrays.sort(persons,sortByScore); System.out.println("根据学生成绩由高到低排序:"); for (Student student:persons) { System.out.println(student); } } } class Student { private String name; private int number; private int score; private int age; public Student(String name,int number,int score,int age){ this.name = name; this.number = number; this.score = score; this.age = age; } //重写Student类的toString()方法,在输入对象时按照以下方式输出 @Override public String toString() { return "Student[name:"+name+",age:"+age+",number:"+number+",score:"+score+"]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //按照学号由低到高排列,创建SortByNumber类,该类实现Comparator,重写该接口的compare() class SortByNumber implements Comparator{ //重写该接口的compare()使其按照学号由小到大排序(前者减去后者) @Override public int compare(Student o1, Student o2) { return o1.getNumber()-o2.getNumber(); } } //按照分数由高到低排列,创建SortByScore类,该类实现Comparator,重写该接口的compare() class SortByScore implements Comparator{ //重写该接口的compare()使其按照分数由高到低排序(后者减去前者) @Override public int compare(Student o1, Student o2) { return o2.getScore()-o1.getScore(); } }
运行结果:
vcg==" src="http://www.2cto.com/uploadfile/Collfiles/20150428/20150428084639195.png" />
相关推荐
在 main() 方法中,我们创建了一个 Simple 对象数组,并使用 Arrays.sort() 方法对其进行排序,排序时使用 CompareTest Comparator 对象。 Comparable 和 Comparator 的区别 Comparable 接口和 Comparator 都可以...
在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...
在 Java 中,Comparator 和 Comparable 是两个非常重要的接口,它们用于对象的排序操作。这两个接口都是在 java.util 包中定义的,主要用于定制排序规则。 **一、Comparator 接口** Comparator 接口允许我们创建...
Comparable接口是Java中用于对象排序的关键接口,主要应用于需要自动排序的场景。当一个类实现了Comparable接口,意味着该类的对象具备内在的比较逻辑,可以直接进行比较。例如,我们可以创建一个Person类,让它实现...
Java 中的 Comparable 和 Comparator 接口详解 Java 中的 Comparable 和 Comparator 接口都是用于比较和排序的,但是它们之间存在着一些关键的区别。Comparable 是一个排序接口,若一个类实现了 Comparable 接口,...
对于对象数组,如果对象类实现了`Comparable`接口,我们可以直接使用`Arrays.sort()`方法对数组进行排序。但是,当需要按照多个属性排序时,我们需要自定义`Comparator`。例如,假设我们有一个`Person`类,包含`...
在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...
在Java编程语言中,`Comparable`接口和`Comparator`接口是两种重要的排序机制,它们用于对集合中的对象进行比较和排序。理解它们的区别对于任何Java开发者来说都是至关重要的。 首先,`Comparable`接口位于`java....
本文将深入探讨如何在Java中对对象进行排序,以及相关的知识点。 首先,Java中的对象排序主要涉及到两个核心概念:Comparable接口和Comparator接口。当需要对一个类的对象进行排序时,有两种基本策略: 1. **实现...
这个算法在Java中主要体现在`java.util.Arrays`和`java.util.Collections`两个类中,提供了对数组和集合的排序功能。下面我们将深入探讨`sort`排序算法的工作原理、性能分析以及实际应用示例。 ### 1. `Arrays.sort...
如果对象实现了`Comparable`接口,`Arrays.sort()`会自动使用`compareTo()`方法进行排序。如果没有实现,可以传入一个`Comparator`实例进行定制排序。 二、泛型与`Comparator` 1. 泛型的引入:Java 5.0引入了泛型...
在Java中,我们可以对两种类型的元素进行排序:原始类型(如int、char)和对象。对于对象,排序主要涉及到`Comparable`接口和`Comparator`接口。 - **Comparable接口**:如果一个类的实例需要被排序,那么该类应该...
总的来说,Java提供了多种方式对对象进行排序,包括ArrayList的`Collections.sort()`,HashSet的转换和排序,以及TreeSet的自然排序和Comparator排序。理解这些机制可以帮助我们更好地控制数据结构的排序行为,从而...
在Java编程语言中,Comparable和Comparator接口用于对对象进行比较和排序。这两个接口在很多情况下都能派上用场,但它们的应用场景和实现方式有所不同。 首先,Comparable接口是排序接口,意味着一个类如果实现了...
标准库提供了多种排序方式,其中一种是使用`Comparator`接口来实现自定义排序。本教程将深入探讨如何使用`Comparator`来实现对对象集合的定制排序。 `Comparator`接口位于`java.util`包下,它定义了一个方法`...
Java中的Comparable和Comparator接口在处理数据排序时都扮演着重要角色,但它们有着明显的区别。 **Comparable接口** 是Java基础语言包`java.lang`的一部分,它定义了一个单一的方法`compareTo(T o)`。任何实现了...
对于自定义对象的排序,我们需要实现 `Comparable` 接口或者提供一个 `Comparator` 实例。例如,假设我们有一个 `Person` 类: ```java class Person implements Comparable<Person> { String name; int age; /...
在`List`对象集合中使用`Comparator`进行排序,通常需要调用`Collections.sort()`或`list.sort()`方法。例如,假设我们有一个`Person`类,其中包含`name`和`age`属性,我们想要根据年龄对`Person`对象列表进行排序:...
这两个方法都可以对基本类型和对象类型的数组或集合进行排序,但默认情况下,它们依赖于元素的自然顺序,即元素类型的`Comparable`接口实现。 首先,我们来理解什么是自然顺序。如果一个类的实例可以直接与其他实例...