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

来源:互联网 发布:上海网络大学消防专业 编辑:程序博客网 时间:2024/05/29 16:30


类 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方法@Overridepublic 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;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}@Overridepublic 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





0 0