TreeSet将元素存储在红黑树(二叉树)数据结构中。
TreeSet集合特点:排序和唯一。能够对元素按照某种规则进行排序,同时也保证元素的唯一。
两种排序方式:自然排序、比较器排序。
第一个元素存储的时候,直接作为根节点。
从第二个开始,每个元素从根节点开始比较:
大——就作为右孩子
小——就作为左孩子
相等——不搭理它
1.自然排序
1)让元素所属的类实现Comparable接口
2) 在类中重写Comparable的抽象方法compareTo()
缺点:此类对象一旦在类中重写compateTo方法后, 只能有一种确定的排序方式。
public class TreeSet01 {
public static void main(String[] args) {
TreeSet<Integer> tree=new TreeSet<>();//看构造方法,采取的是自然排序。
tree.add(99);
tree.add(10);
tree.add(5);
tree.add(6);
tree.add(11);
tree.add(59);
tree.add(83);
for(Integer num:tree){
System.out.print(num+" ");
}
}
}
真正比较的是依赖元素的compareTo()方法,而这个方法是定义在Comparable里面的。所以,你要想重写此方法。就必须是先实现Comparable接口。本例中Integer类本身已实现了Comparable接口,重写了compare()方法。
Comparable接口:此接口强行对实现它的每个类的对象进行整体排序,这个排序称为自然排序。
Comparable接口的方法:int compareTo(T o) 将此对象与指定的对象进行比较以进行排序。 参数 o - 要比较的对象。
结果:负整数,零或正整数,因为该对象小于,等于或大于指定对象。
public class TreeSet02 {
public static void main(String[] args) {
TreeSet<Person> treeSet=new TreeSet<>();
treeSet.add(new Person(19,"a"));
treeSet.add(new Person(9,"an"));
treeSet.add(new Person(22,"uy"));
treeSet.add(new Person(19,"w"));
//使用迭代器遍历
Iterator<Person> it=treeSet.iterator();
while(it.hasNext()){
System.out.println(it.next()+" ");
}
System.out.println();
}
}
class Person implements Comparable<Person>{//继承Comparable接口
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Peson{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
//重写compareTo()方法,按照age排序,如果age相同,再按照name排序
public int compareTo(Person o) {
int result=this.age>o.getAge()?1:(this.age==o.getAge()?0:-1);
if(result==0){
return this.name.compareTo(o.getName());
}
return result;
}
}
2.创建比较器类
1)实现Comparator接口
2)重写compare方法
优点: 能够通过创建不同的比较器类,就能实现不同的排序方式。
public class TreeSer03 {
public static void main(String[] args) {
//调用自己的比较器MyComparator
TreeSet<Student> tree=new TreeSet<Student>(new MyComparator());
tree.add(new Student(6,"ww"));
tree.add(new Student(18,"b"));
tree.add(new Student(28,"bad"));
tree.add(new Student(14,"b"));
tree.add(new Student(28,"ba"));
Iterator<Student> it=tree.iterator();
while(it.hasNext()){
System.out.println(it.next()+" ");
}
System.out.println();
}
}
class MyComparator implements Comparator<Student>{
@Override
//重写compare方法,传入两个参数
public int compare(Student o1, Student o2) {
int result=o1.getAge()>o2.getAge()?1:(o1.getAge()==o2.getAge()?0:-1);
if(result==0){
return o1.getName().compareTo(o2.getName());
}
return result;
}
}
class Student{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}