集合TreeSet的使用-java

21 篇文章 1 订阅

TreeSet的特点:可排序、不重复、无索引。

可排序:按照元素的大小默认升序排序;底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。

对于数值、字符串类型的(Integer 、Double、String)TreeSet可以排序,而对于自定义类型对象就不能直接排序。

示例1:

对于以下类:
class StudentT {
    int Id;
    String name;
    int age;
    public StudentT(int Id,String name,int age){
        this.Id=Id;
        this.name=name;
        this.age=age;
    }
    @Override
    public String toString() {
        return "StudentT{" +
                "Id=" + Id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
创建以下有重复对象,使用TreeSet:
    Set<StudentT> ste2=new TreeSet<>();
        StudentT s1=new StudentT(1201,"李白",19);
        ste2.add(new StudentT(1201,"李白",19));
        ste2.add(new StudentT(1230,"李思",18));
        ste2.add(new StudentT(1206,"张三",19));
        ste2.add(new StudentT(1201,"李白",19));
        System.out.println(ste2);

运行结果:

Exception in thread "main" java.lang.ClassCastException: class set_1.StudentT cannot be cast to class java.lang.Comparable (set_1.StudentT is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')

at java.base/java.util.TreeMap.compare(TreeMap.java:1569)

*****************************

at set_1.TreeSet1.main(TreeSet1.java:22)

这就是说:想要使用TreeSet存储自定义类型,需要制定排序规则

  • 自定义排序规则(两种)

  1. 让自定义的类实现Comparable接口重写里面的compareTo方法来定制比较规则。

class StudentT implements Comparable<StudentT>{
    int Id;
//***********省略同上部分内容*******************
    @Override
    public int compareTo(StudentT o) {
        return this.Id-o.Id;//选择你需要的排序内容,返回值大于0表示是升序
    }
}
  1. TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。(优先级更高

        Set<StudentT> ste2=new TreeSet<>(new Comparator<StudentT>() {
            @Override
            public int compare(StudentT o1, StudentT o2) {
                return o1.getId()-o2.getId();
            }
        });
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super algorithm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值