集合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();
            }
        });
相关文章
|
12天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
34 3
|
29天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
44 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
49 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
42 2
|
2月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2月前
|
Java 开发者
从 Java 中的 Set 集合中删除元素
【10月更文挑战第30天】
|
2月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
38 0
|
2月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
44 0