TreeSet

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 + '\'' +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值