Java中list实现排序的几种方式

本文介绍了如何使用Collections.sort()配合Comparable接口对Integer类型集合排序,以及如何通过实现Comparable接口和Comparator匿名内部类处理对象包含多个属性的复杂排序。对比了Comparable与Comparator的区别,并强调了各自的优缺点和适用场景。
摘要由CSDN通过智能技术生成

1.运用Collections.sort()方法(只包含Integer类型的单属性类型):

public class Text {
	public static void main(String[] args) {
	
		List<Integer> res = new ArrayList<Integer>();
		res.add(2);
		res.add(4);
		res.add(3);
		res.add(0);
		System.out.println(res);
		Collections.sort(res);
		System.out.println(res);
	}
}

本质上Integer类系统已经实现了Comparable接口

2. 实现Comparable接口(适合对象包含多个属性的集合排序):

package core.java.collection.collections;
public class Student implements Comparable<Student>{
	private int score;
	private int age;
	public Student(int score, int age){
		super();
		this.score = score;
		this.age = age;
	}
	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;
	}
	@Override
	public int compareTo(User o) {
		int i = this.getAge() - o.getAge();//先比较年龄
		if(i == 0){
			return this.score - o.getScore();//如年龄一样再比较分数
		}
		return i;
	}
}
 
public static void main(String[] args) {
	List<Student> stus = new ArrayList<Student>();
	stus.add(new Student(15, 80));
	stus.add(new Student(14, 87));
	stus.add(new Student(14, 67));
	stus.add(new Student(13, 100));
	Collections.sort(stus);
	for(Student stu : stus){
		System.out.println(stu.getScore() + "," + stu.getAge());
	}
}

注意:实现compareTo()方法,该方法的返回值0代表相等,1表示大于,-1表示小于;

3.实现Comparator的匿名内部类(也是适合对象包含多个属性的集合排序)

package core.java.collection.collections;
public class Students {
	private int age;
	private int score;
	public Students(int age, int score){
		super();
		this.age = age;
		this.score = score;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
}
public static void main(String[] args) {
	List<Students> students = new ArrayList<Students>();
	students.add(new Students(15, 98));
	students.add(new Students(14, 98));
	students.add(new Students(14, 99));
	students.add(new Students(13, 95));
	students.add(new Students(16, 89));
	Collections.sort(students, new Comparator<Students>() {
		@Override
		public int compare(Students o1, Students o2) {
			int i = o1.getScore() - o2.getScore();
			if(i == 0){
				return o1.getAge() - o2.getAge();
			}
			return i;
		}
	});
	for(Students stu : students){
		System.out.println("score:" + stu.getScore() + ":age" + stu.getAge());
	}
	
}

Comparable和Comparator区别比较

Comparable类似“内部比较”,而Comparator类似“外部比较”。
Comparable:是一个带有排序功能的接口,如果某个类实现了Comparable接口,就意味着“该类支持排序”。
Comparator:是比较器,如果需要控制某个类的次序,就可以建立个“该类的比较器”来进行排序。

两种方法各有优劣:
Comparable比较 简单, 只需实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码;
用Comparator 的优点是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 且在Comparator 里面就可以实现复杂的可以通用的比较,使其能够匹配一些简单的对象,就可以节省很多重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值