类 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