TreeSet中红黑树依赖的2种排序方式

本文介绍Java中两种主要的集合排序方法:自然排序和比较器排序。通过实例演示如何使用这两种方法对自定义类进行排序,并解释了每种方法的适用场景。

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

方式1:自然排序(元素具备比较性):让元素所属的类实现自然排序接口Comparable<T>。

举例:Integer类实现了Comparable接口,如果你自定义类,该类必须实现Comparable<T>接口,并且重写接口定义的compareTo(T o)方法。

public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
	super();
	// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Student[age = "+age+",name = "+name+"]";
	}
//以年龄作为主判断依据
//@Override
//	public int compareTo(Student s) {
//		// TODO Auto-generated method stub
//		int num = this.age -  s.age;
//		int num2 = num == 0?this.name.compareTo(s.name):num;
//		return num2;
//	}
//以名字的长度作为主判断依据
@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
	int num = this.name.length() - o.name.length();
	int num2 = num == 0?this.name.compareTo(o.name):num;
	int num3 = num2 == 0?this.age - o.age:num2;
		return num3;
	}
}

方式2:比较器排序(集合具备比较性):让集合的构造方法接收一个比较器接口Comparator<T>的子类对象。

注意:与方式1比较,方式2更加的常用,因为不用改变Student类,这样就避免了影响其他人使用Student类。

举例:

import java.util.Comparator;
import java.util.TreeSet;

/*
 * 需求:请按照姓名的长度排序
 * 
 * TreeSet集合保证元素排序和唯一性的原理
 * 唯一性:是根据比较的返回是否是0来决定。
 * 排序:
 * 		A:自然排序(元素具备比较性)
 * 			让元素所属的类实现自然排序接口 Comparable
 * 		B:比较器排序(集合具备比较性)
 * 			让集合的构造方法接收一个比较器接口的子类对象 Comparator
 */
public class TreeSetDemo {
	public static void main(String[] args) {
		// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
		// 而匿名内部类就可以实现这个东西
		TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
			@Override
			public int compare(Student s1, Student s2) {
				// 姓名长度
				int num = s1.getName().length() - s2.getName().length();
				// 姓名内容
				int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
						: num;
				// 年龄
				int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
				return num3;
			}
		});

		// 创建元素
		Student s1 = new Student("linqingxia", 27);
		Student s2 = new Student("zhangguorong", 29);
		Student s3 = new Student("wanglihong", 23);
		Student s4 = new Student("linqingxia", 27);
		Student s5 = new Student("liushishi", 22);
		Student s6 = new Student("wuqilong", 40);
		Student s7 = new Student("fengqingy", 22);
		Student s8 = new Student("linqingxia", 29);

		// 添加元素
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		ts.add(s8);

		// 遍历
		for (Student s : ts) {
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值