`
youyu4
  • 浏览: 440463 次
社区版块
存档分类
最新评论

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序 -- 转

 
阅读更多

一、描述

自定义的类要按照一定的方式进行排序,比如一个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+"]";
	}
	
}

运行结果:

 

comparable

 

方式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" />

 

 

分享到:
评论

相关推荐

    Comparable接口和Comparator使用示例

    在 main() 方法中,我们创建了一个 Simple 对象数组,并使用 Arrays.sort() 方法对其进行排序,排序时使用 CompareTest Comparator 对象。 Comparable 和 Comparator 的区别 Comparable 接口和 Comparator 都可以...

    java排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...

    java的Comparator和Comparable.docx

    在 Java 中,Comparator 和 Comparable 是两个非常重要的接口,它们用于对象的排序操作。这两个接口都是在 java.util 包中定义的,主要用于定制排序规则。 **一、Comparator 接口** Comparator 接口允许我们创建...

    Comparable和Comparator区分1

    Comparable接口是Java中用于对象排序的关键接口,主要应用于需要自动排序的场景。当一个类实现了Comparable接口,意味着该类的对象具备内在的比较逻辑,可以直接进行比较。例如,我们可以创建一个Person类,让它实现...

    详解Java中Comparable和Comparator接口的区别

    Java 中的 Comparable 和 Comparator 接口详解 Java 中的 Comparable 和 Comparator 接口都是用于比较和排序的,但是它们之间存在着一些关键的区别。Comparable 是一个排序接口,若一个类实现了 Comparable 接口,...

    JAVA 对象数组按照多个属性进行排序

    对于对象数组,如果对象类实现了`Comparable`接口,我们可以直接使用`Arrays.sort()`方法对数组进行排序。但是,当需要按照多个属性排序时,我们需要自定义`Comparator`。例如,假设我们有一个`Person`类,包含`...

    Comparable与Comparator的区别

    在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...

    Comparable与Comparator的区别Java开

    在Java编程语言中,`Comparable`接口和`Comparator`接口是两种重要的排序机制,它们用于对集合中的对象进行比较和排序。理解它们的区别对于任何Java开发者来说都是至关重要的。 首先,`Comparable`接口位于`java....

    java 对象 排序

    本文将深入探讨如何在Java中对对象进行排序,以及相关的知识点。 首先,Java中的对象排序主要涉及到两个核心概念:Comparable接口和Comparator接口。当需要对一个类的对象进行排序时,有两种基本策略: 1. **实现...

    java sort排序算法实例完整代码

    这个算法在Java中主要体现在`java.util.Arrays`和`java.util.Collections`两个类中,提供了对数组和集合的排序功能。下面我们将深入探讨`sort`排序算法的工作原理、性能分析以及实际应用示例。 ### 1. `Arrays.sort...

    Java5.0数组排序

    如果对象实现了`Comparable`接口,`Arrays.sort()`会自动使用`compareTo()`方法进行排序。如果没有实现,可以传入一个`Comparator`实例进行定制排序。 二、泛型与`Comparator` 1. 泛型的引入:Java 5.0引入了泛型...

    java对象排序

    在Java中,我们可以对两种类型的元素进行排序:原始类型(如int、char)和对象。对于对象,排序主要涉及到`Comparable`接口和`Comparator`接口。 - **Comparable接口**:如果一个类的实例需要被排序,那么该类应该...

    Java 对象排序详解.rar_java 对象排序_对象_排序

    总的来说,Java提供了多种方式对对象进行排序,包括ArrayList的`Collections.sort()`,HashSet的转换和排序,以及TreeSet的自然排序和Comparator排序。理解这些机制可以帮助我们更好地控制数据结构的排序行为,从而...

    对比Java中的Comparable排序接口和Comparator比较器接口

    在Java编程语言中,Comparable和Comparator接口用于对对象进行比较和排序。这两个接口在很多情况下都能派上用场,但它们的应用场景和实现方式有所不同。 首先,Comparable接口是排序接口,意味着一个类如果实现了...

    493.491.JAVA基础教程_常用类-使用Comparator实现定制排序(493).rar

    标准库提供了多种排序方式,其中一种是使用`Comparator`接口来实现自定义排序。本教程将深入探讨如何使用`Comparator`来实现对对象集合的定制排序。 `Comparator`接口位于`java.util`包下,它定义了一个方法`...

    java中Comparable和Comparator的区别

    Java中的Comparable和Comparator接口在处理数据排序时都扮演着重要角色,但它们有着明显的区别。 **Comparable接口** 是Java基础语言包`java.lang`的一部分,它定义了一个单一的方法`compareTo(T o)`。任何实现了...

    JAVA中的随机数产生和排序

    对于自定义对象的排序,我们需要实现 `Comparable` 接口或者提供一个 `Comparator` 实例。例如,假设我们有一个 `Person` 类: ```java class Person implements Comparable<Person> { String name; int age; /...

    List对象集合的排序:比较器Comparator(简单例子)

    在`List`对象集合中使用`Comparator`进行排序,通常需要调用`Collections.sort()`或`list.sort()`方法。例如,假设我们有一个`Person`类,其中包含`name`和`age`属性,我们想要根据年龄对`Person`对象列表进行排序:...

    Java实现类排序

    这两个方法都可以对基本类型和对象类型的数组或集合进行排序,但默认情况下,它们依赖于元素的自然顺序,即元素类型的`Comparable`接口实现。 首先,我们来理解什么是自然顺序。如果一个类的实例可以直接与其他实例...

Global site tag (gtag.js) - Google Analytics