通过实现Comparable接口结合TreeSet来对对象自动排序



经过会遇到这样的情况,对于某个对象数组或者链表要按照一定的规则进行排序,那么我们该怎么做呢?

如遇到这样的需求:

1.需求1
对于学生对象按照年龄进行排序,年龄小的排在前面。

单单看到这样的需求,实现起来是比较简单的,自己写个函数实现一下快速排序或者比较土的冒泡排序,按照年龄来排序就可以了。我们再看看下面的需求

2.需求2

对于学生对象,按照年龄进行排序,年龄小的排在前面,年龄相同的,身高小的排在前面。

3.需求3

对于学生对象,按照年龄进行排序,年龄小的排在前面;年龄相同的,身高小的排在前面;身高相同时,体重轻的排在前面。

。。。


这样的需求,可能会随着页面的复杂化,越来越来复杂,如果要自己去做的话,估计得多层嵌套了,逻辑非常复杂,那是否有现成的比较简单的机制呢。

答案就是实现Comparable接口。

具体样例如下:

public class Student implements Comparable{
	private int age;
	
	public Student(int age)
	{
		this.age = age;
	}
	@Override
	public int compareTo(Object obj) {
		Student stu = (Student)obj;
		if(this.age>stu.age)
			return 1;
		else if(this.age<stu.age)
			return -1;
		else
			return 0;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

}


调用代码:

	public static void main(String[] args) {
		TreeSet<Student> treeSet = new TreeSet<Student>();
		treeSet.add(new Student(1));
		treeSet.add(new Student(3));
		treeSet.add(new Student(2));
		for(Student student:treeSet)
		{
			System.out.println(student.getAge());
		}
	}


输出结果:

1

2

3

可见自动按照年龄进行了排序,我们再修改一下代码,让学生按照年龄由大到排列:

	public int compareTo(Object obj) {
		Student stu = (Student)obj;
		if(this.age>stu.age)
			return -1;
		else if(this.age<stu.age)
			return 1;
		else
			return 0;
	}

输出结果:

3

2

1


由此可见,这种通过对象实现Comparable接口,结合TreeSet的方式来进行对象排序,还是十分方便的,而且逻辑比较简单,后续如果有变更,直接修改compareTo方法即可。


原文地址:https://www.cnblogs.com/jerry1999/p/4175933.html