集合TreeSet的使用-java

简介: 集合TreeSet的使用-java

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天前
|
存储 前端开发 Java
深入探索Java集合框架:核心组件与高效应用
深入探索Java集合框架:核心组件与高效应用
|
1天前
|
存储 算法 Java
Java数组与集合的深入解析
Java数组与集合的深入解析
7 0
|
1天前
|
存储 安全 Java
|
1天前
|
存储 安全 Java
Java中的线程安全集合
【5月更文挑战第30天】在多线程环境下,为了保证数据的一致性和完整性,我们需要使用线程安全的集合。本文将介绍Java中常用的线程安全集合及其使用方法。
|
2天前
|
存储 安全 Java
Java的集合框架
Java的集合框架
|
3天前
|
编解码 安全 算法
Java多线程基础-18:线程安全的集合类与ConcurrentHashMap
如果这些单线程中的集合类确实需要在多线程中使用,该怎么办呢?思路有两个: 最直接的方式:使用锁,手动保证。如多个线程修改ArrayList对象,此时就可能有问题,就可以给修改操作进行加锁。但手动加锁的方式并不是很方便,因此标准库还提供了一些线程安全的集合类。
20 4
|
3天前
|
安全 Java 容器
Java 多线程系列Ⅶ(线程安全集合类)
Java 多线程系列Ⅶ(线程安全集合类)
|
3天前
|
存储 Java Serverless
Java集合利器 Map & Set
Java集合利器 Map & Set
|
3天前
|
存储 算法 Java
手撕Java集合——链表
手撕Java集合——链表
|
3天前
|
存储 Java 容器
初识Java集合框架
初识Java集合框架