java中Collections的两种排序方法

本文介绍Java中使用Collections.sort方法对自定义对象列表进行排序的方法。包括实现Comparable接口和使用Comparator接口两种方式,并通过具体示例说明如何操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编程中时不时需要进行排序,在java中有内置的函数可以简便高效地进行排序,这就是Collections.sort方法。这个方法有两个重载版本,一个是只有一个参数的List<T>,此时要求这个列表的所有对象都是可以比较的。也就是说需要实现Comparable接口,同时实现接口下的compareTo函数。另一个sort方法有两个参数:List<T>和Comparator<? super T>。此时不要求List中的对象实现Comparable接口,但是却要求传人另一个比较对象,这个对象必须实现Comparator接口,同时实现接口下的compare函数。

下面是一个运用两种排序方法的小程序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Student implements Comparable<Student>
{
	private String name;
	private int id;
	private int score;

	public Student()
	{
		// empty
	}

	public Student(String name, int id, int score)
	{
		this.name = name;
		this.id = id;
		this.score = score;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	public int getScore()
	{
		return score;
	}

	public void setScore(int score)
	{
		this.score = score;
	}

	@Override
	public String toString()
	{
		return "Student [name=" + name + ", id=" + id + ", score=" + score + "]";
	}

	@Override
	public int compareTo(Student o)
	{
		/*
		 * 如果当前对象小于另一个对象,则返回负数 
		 * 如果当前对象大于另一个对象,则返回正数
		 * 如果当前对象等于(比较意义上的等于)另一个对象,则返回0
		 */
		if (id < o.getId())
			return -1;
		if (id > o.getId())
			return 1;
		return 0;
	}
}

class SortStudentByScore implements Comparator<Student>
{
	@Override
	public int compare(Student o1, Student o2)
	{
		/*
		 * 如果第一个对象小于第二个对象,则返回负数 
		 * 如果第一个对象大于第二个对象,则返回正数
		 * 如果第一个对象等于(比较意义上的等于)第二个对象,则返回0
		 */
		if (o1.getScore() < o2.getScore())
			return -1;
		if (o1.getScore() > o2.getScore())
			return 1;
		return 0;
	}
	
}

class Teacher
{
	private String name;
	private int id;

	public Teacher()
	{
		// empty
	}

	public Teacher(String name, int id)
	{
		super();
		this.name = name;
		this.id = id;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	@Override
	public String toString()
	{
		return "Teacher [name=" + name + ", id=" + id + "]";
	}

}

class SortTeacherById implements Comparator<Teacher>
{
	@Override
	public int compare(Teacher o1, Teacher o2)
	{
		return o1.getId() - o2.getId();
	}
	
}

public class Test
{
	private ArrayList<Student> students = new ArrayList<Student>();
	private ArrayList<Teacher> teachers = new ArrayList<Teacher>();

	private void getStudents()
	{
		Student stu1 = new Student("Tom", 1, 70);
		Student stu2 = new Student("Amy", 3, 60);
		Student stu3 = new Student("Sunny", 2, 100);
		Student stu4 = new Student("Tony", 4, 80);

		students.add(stu1);
		students.add(stu2);
		students.add(stu3);
		students.add(stu4);
	}
	
	private void getTeachers()
	{
		Teacher t1 = new Teacher("Li", 1);
		Teacher t2 = new Teacher("Wang", 4);
		Teacher t3 = new Teacher("Zhang", 2);
		Teacher t4 = new Teacher("Zhao", 3);

		teachers.add(t1);
		teachers.add(t2);
		teachers.add(t3);
		teachers.add(t4);
	}

	private void printStudents()
	{
		for (Student stu : students)
			System.out.println(stu);
	}
	
	private void printTeachers()
	{
		for (Teacher t : teachers)
			System.out.println(t);
	}

	private void testSort()
	{
		getStudents();
		System.out.println("-----Student Class implements Comparable------");
		System.out.println("-----------init, before sort------------");
		printStudents();

		Collections.sort(students);
		System.out.println("-------after sort by Comparable, sort by id-------");
		printStudents();

		Collections.sort(students, new SortStudentByScore());
		System.out.println("-------after sort by Comparator, sort by score-----");
		printStudents();
		
		System.out.println();
		
		getTeachers();
		System.out.println("-----Teacher Class not implements Comparable------");
		System.out.println("-----------init, before sort------------");
		printTeachers();
		
		Collections.sort(teachers, new SortTeacherById());
		System.out.println("-----------after sort by Comparator-------------");
		printTeachers();
	}

	public static void main(String[] argv)
	{
		Test test = new Test();
		test.testSort();
	}
}


程序运行结果如下图


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值