TreeSet

我们都知道Set的集合是无序的,但是TreeSet却是一个有序的集合,在这里说的有序并不是像List集合那样有次序,这里的次序就是可以通过下标来遍历数组。TreeSet具有唯一性,相同元素只添加一次。
在这里插入图片描述

想要了解一个类就需要去翻api文档,如上图我们可以知道,它继承了AbstractSet这个抽象类,并且实现了如下图的接口
在这里插入图片描述

TreeSet的构造方法

在这里插入图片描述

如上图第一个构造方法是构造一个空的数组,他的元素排序是自然排序。第二个构造函数是,把一个集合传过去,生成一个TreeSet集合,其排序规则是自然排序。第三个构造方法是创建一个空的数组,按照指定的比较器进行排序。

TreeSet的排序方式

自然排序

要求这个元素所在的类实现Comparable接口,重写方法compareTo()方法,

​ this==0相等,不会添加元素

​ this >obj ,添加到原来对象的右边

​ this>obj //添加到原来对象的左边

缺点:排序方式固定,无法更改,不灵活
举个自然排序的例子:

public class User implements Comparable{

    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Object o) {
        //比如按照年龄比较;当年龄相等返回0,大于返回1,小于返回-1
        User user = (User)o;
        if(this.age > user.age){
            return 1;
        }else if(this.age<user.age){
            return -1;
        }else{
            return this.name.compareTo(user.name);
        }
    }
}

当插入多个User对象了之后就会根据年龄的大小进行排序。

指定排序

不需要元素所在类,实现comparator接口,需要传递comparator接口。
不需要元素所在的类实现接口,根据指定比较器的指定排序规则进行排序。在使用的时候创建一个comparator的实现类,在构造这个类的时候加载我们创建的comparator实现类。

  TreeSet treeSet1 = new TreeSet(new Comparator() {   //匿名内部类
            @Override
            //o1 新添加的元素   o2旧的元素
            public int compare(Object o1, Object o2) {
                Student stu1 = (Student)o1;
                Student stu2 = (Student)o2;
                if (stu1.equals(stu2)){
                    return 0;
                }
                if (stu1.getAllScore()==stu2.getAllScore()){
                    return 1;
                }
                return stu2.getAllScore() - stu1.getAllScore();
            }
        });

String,八大基本数据类型的包装类已经实现了comparator接口,可以把,String与,包装类的数据直接添加到TreeSet,帮我们自然排序。
如果一个元素所在的类既没有实现comparator,而又没有传递comparator接口,程序会抛出异常

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值