二叉树TreeSet类的使用原理和compareTo()方法


类 TreeSet<E>

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
基于 TreeMap 的 NavigableSet 实现。
使用元素的自然顺序对元素进行排序,
或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。 

public TreeSet()
	构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
	*插入该 set 的所有元素都必须实现 Comparable 接口。
	所有这些元素都必须是可互相比较的:
	对于 set 中的任意两个元素 e1 和 e2,执行 e1.compareTo(e2) 都不得抛出 ClassCastException。
public TreeSet(Collection<? extends E> c)
	构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序
	它根据指定比较器进行排序。
	插入到该 set 的所有元素都必须能够由指定比较器进行相互比较:
	对于 set 中的任意两个元素 e1 和 e2,执行 comparator.compare(e1, e2) 都不得抛出 ClassCastException。
接口 Comparator<T>
类型参数:
T - 此 Comparator 可以比较的对象类型
public interface Comparator<T>
强行对某个对象 collection 进行整体排序 的比较函数。
方法摘要 
 int compare(T o1, T o2) 
          比较用来排序的两个参数。 
 boolean equals(Object obj) 
          指示某个其他对象是否“等于”此 Comparator。 

public TreeSet(SortedSet<E> s)
	构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。 


import java.util.Comparator;
import java.util.TreeSet;
import bean.Student;

public class d {
	public static void main(String[] args) {
		TreeSet<Integer> ts = new TreeSet<>();
		ts.add(3);
		ts.add(1);
		ts.add(1);
		ts.add(2);
		ts.add(2);
		ts.add(3);
		ts.add(3);
		System.out.println(ts);//[1, 2, 3]

		
		TreeSet<Student> ts1 = new TreeSet<>();
		ts1.add(new Student("张三", 23));
		ts1.add(new Student("李四", 13));
		ts1.add(new Student("周七", 13));
		ts1.add(new Student("王五", 43));
		ts1.add(new Student("赵六", 33));
		System.out.println(ts1);
		/* java.lang.ClassCastException: 
		 * bean.Student cannot be cast to java.lang.Comparable
		 * 插入该 set 的所有元素都必须实现 Comparable 接口。
		 * 所以,student类必须实现 Comparable 接口。
		 * 并重写compareTo方法
		 * 
		 * 当compareTo方法返回0的时候集合中只有一个元素
		 * 当compareTo方法返回正数的时候集合会怎么存就怎么取
		 * 当compareTo方法返回负数的时候集合会倒序存储
		 * TreeSet,即二叉树-两个叉
		 * 小的存储在左边(负数)大的存储在右边(正数),相等就不存(0)
		 * 在TreeSet集合中如何储存元素取决于compareTo方法返回值
		 * 0,即两个元素总是相等,集合中只有一个元素,根元素
		 * -1,存储在左边,将存储的元素倒序
		 * 1,怎么存怎么取
		 */
		
		
		//按照姓名排序
		/*public int compareTo(Person o) {
			int num = this.name.compareTo(o.name);		//姓名是主要条件
			return num == 0 ? this.age - o.age : num;	//年龄是次要条件*/		
		TreeSet<Student> ts2 = new TreeSet<>();
		ts2.add(new Student("李四", 13));
		ts2.add(new Student("张三", 23));
		ts2.add(new Student("王五", 43));
		ts2.add(new Student("赵六", 33));
		
		System.out.println('张');
		System.out.println('张' + 0);
		System.out.println('李' + 0);
		System.out.println('王' + 0);
		System.out.println('赵' + 0);
		System.out.println(ts2);
		
		
		//需求:将字符串按照长度排序
		TreeSet<String> ts3 = new TreeSet<>(new CompareByLen());	
		//Comparator c = new CompareByLen();
		ts3.add("aaaaaaaa");
		ts3.add("z");
		ts3.add("wc");
		ts3.add("nba");
		ts3.add("cba");
		System.out.println(ts3);
	}

}
//将字符串按照长度排序
class CompareByLen /*extends Object*/ implements Comparator<String> {
	//默认继承  Object类,此类有equals方法,所以可以不用重写equals方法
	@Override
	public int compare(String s1, String s2) {		//按照字符串的长度比较
		int num = s1.length() - s2.length();		//长度为主要条件
		return num == 0 ? s1.compareTo(s2) : num;	//内容为次要条件
	}
}
附上student类

package bean;

public class Student implements Comparable<Student> {
	
	String name;
	int age;
	
	public Student() {
		super();
		
	}
	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() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	@Override
	public int compareTo(Student obj) {
		// TODO Auto-generated method stub
		//return 0;
		//根元素为13 ,传入的为23,23这个对象调用 compareTo方法 23-13》0,在13的右边
		//return (this.age - obj.age);
		int num = this.age - obj.age;//age是主要判据
		//string里面重写了compareto方法,按字典顺序
		return num == 0 ? this.name.compareTo(obj.name) : num;
	}
		
}


总结TreeSet原理

* 1.特点 * TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列 * 2.使用方式 * a.自然顺序(Comparable) * TreeSet类的add()方法中会把存入的对象提升为Comparable类型 * 调用对象的compareTo()方法和集合中的对象比较 * 根据compareTo()方法返回的结果进行存储 * b.比较器顺序(Comparator) * 创建TreeSet的时候可以制定 一个Comparator * 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序 * add()方法内部会自动调用Comparator接口中compare()方法排序 * 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数 * c.两种方式的区别 * TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException) * TreeSet如果传入Comparator, 就优先按照Comparator





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值