news 2026/5/26 7:13:47

java当中TreeSet集合(详细版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java当中TreeSet集合(详细版)

TreeSet集合的概述

(1)不可以存储重复元素

(2)没有索引

(3)可以将元素按照规则进行排序

TreeSet():根据其元素的自然排序进行排序

TreeSet(Comparator comparator) :根据指定的比较器进行排序

TreeSet集合的基本使用

public class TreeSetDemo01 { public static void main(String[] args) { //创建集合对象 TreeSet<Integer> ts = new TreeSet<Integer>(); //添加元素 ts.add(10); ts.add(40); ts.add(30); ts.add(50); ts.add(20); ts.add(30); //遍历集合 for(Integer i : ts) { System.out.println(i); } } }

自然排序Comparable的使用

需求:

存储学生对象并遍历,创建TreeSet集合使用无参构造方法

要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

实现步骤

  1. 使用空参构造创建TreeSet集合

    • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的

  2. 自定义的Student类实现Comparable接口

    • 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法

  3. 重写接口中的compareTo方法

    • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

代码实现

学生类

public class Student implements Comparable<Student>{ private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Student o) { //按照对象的年龄进行排序 //主要判断条件: 按照年龄从小到大排序 int result = this.age - o.age; //次要判断条件: 年龄相同时,按照姓名的字母顺序排序 result = result == 0 ? this.name.compareTo(o.getName()) : result; return result; } }

这里可能有人会疑问,当年龄相同的时候,怎么按照姓名的字母顺序排序呢,不是递归调用了吗,本人一开始也是没有理解,查资料才知道,当年龄相同的时候会获取this.name.compareTo(o.getName())这个结果,this.name指的是一个字符串,字符串当中也有一个compareTo方法,这个方法在Java中,String类实现了Comparable接口,它的compareTo()方法是按照字典顺序(lexicographical order)进行比较的,这实际上就是按照字母顺序排序。

测试类

public class MyTreeSet2 { public static void main(String[] args) { //创建集合对象 TreeSet<Student> ts = new TreeSet<>(); //创建学生对象 Student s1 = new Student("zhangsan",28); Student s2 = new Student("lisi",27); Student s3 = new Student("wangwu",29); Student s4 = new Student("zhaoliu",28); Student s5 = new Student("qianqi",30); //把学生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); //遍历集合 for (Student student : ts) { System.out.println(student); } } }

比较器排序Comparator的使用

需求:

存储老师对象并遍历,创建TreeSet集合使用带参构造方法

要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

  • 实现步骤

    • 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的

    • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法

    • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

代码实现

老师类

public class Teacher { private String name; private int age; public Teacher() { } public Teacher(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Teacher{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

测试类

public class MyTreeSet4 { public static void main(String[] args) { //创建集合对象 TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() { @Override public int compare(Teacher o1, Teacher o2) { //o1表示现在要存入的那个元素 //o2表示已经存入到集合中的元素 //主要条件 int result = o1.getAge() - o2.getAge(); //次要条件 result = result == 0 ? o1.getName().compareTo(o2.getName()) : result; return result; } }); //创建老师对象 Teacher t1 = new Teacher("zhangsan",23); Teacher t2 = new Teacher("lisi",22); Teacher t3 = new Teacher("wangwu",24); Teacher t4 = new Teacher("zhaoliu",24); //把老师添加到集合 ts.add(t1); ts.add(t2); ts.add(t3); ts.add(t4); //遍历集合 for (Teacher teacher : ts) { System.out.println(teacher); } } }

两种比较方式的总结

其实这两种方式对应的效果是类似的,实现的方式不同

自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序()

比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序

两种方式中关于返回值的规则(这个可以让我们更好的理解)

  • 如果返回值为负数,表示当前存入的元素是较小值,存左边

  • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存

  • 如果返回值为正数,表示当前存入的元素是较大值,存右边

在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,必须使用比较器排序

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 10:45:20

Qwen3-VL-2B对比Blip-2:轻量级模型部署体验评测

Qwen3-VL-2B对比Blip-2&#xff1a;轻量级模型部署体验评测 1. 引言&#xff1a;轻量级多模态模型的落地挑战 随着多模态大模型在图文理解、视觉问答等场景中的广泛应用&#xff0c;如何在资源受限环境下实现高效部署成为工程实践中的关键问题。Qwen3-VL-2B 和 Blip-2 是当前…

作者头像 李华
网站建设 2026/5/3 4:00:21

架构演进:从数据库“裸奔”到多级防护

噗&#xff0c;这个标题是不是有点AI味&#xff1f;哈哈&#xff0c;确实有让AI起名&#xff0c;但只是起了个名&#xff0c;我原来的标题是&#xff1a;“给你的数据接口提提速&#xff0c;聊聊二级缓存的架构设计” 前言 前阵子给项目做了点性能优化&#xff0c;最核心的手段…

作者头像 李华
网站建设 2026/5/22 21:41:04

HY-MT1.8B vs 商业API实战对比:开源模型精度与成本优势分析

HY-MT1.8B vs 商业API实战对比&#xff1a;开源模型精度与成本优势分析 1. 背景与选型动机 随着多语言业务场景的不断扩展&#xff0c;高质量、低成本的翻译服务成为企业出海、内容本地化和跨语言沟通的核心需求。传统上&#xff0c;开发者普遍依赖Google Translate、DeepL、…

作者头像 李华
网站建设 2026/5/12 21:13:16

Z-Image-Turbo审计日志:记录每次图像生成的时间与IP信息

Z-Image-Turbo审计日志&#xff1a;记录每次图像生成的时间与IP信息 1. 引言 随着AI图像生成技术的广泛应用&#xff0c;系统安全与行为追溯成为不可忽视的重要议题。Z-Image-Turbo作为一款高效、易用的本地化图像生成工具&#xff0c;在提供强大生成能力的同时&#xff0c;也…

作者头像 李华
网站建设 2026/5/23 11:22:14

基于FunASR语音识别镜像快速搭建高精度中文ASR系统

基于FunASR语音识别镜像快速搭建高精度中文ASR系统 1. 引言&#xff1a;为什么选择 FunASR 构建中文语音识别系统&#xff1f; 在当前人工智能技术快速发展的背景下&#xff0c;自动语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;已成为智能客服、会议记…

作者头像 李华
网站建设 2026/5/15 4:39:01

HY-MT1.5-1.8B上下文缓存优化方案

HY-MT1.5-1.8B上下文缓存优化方案 1. 技术背景与问题提出 随着多语言交互需求的快速增长&#xff0c;翻译模型在实际应用中面临更高的性能和效率要求。特别是在实时对话、边缘设备部署等场景下&#xff0c;模型不仅要保证高质量的翻译输出&#xff0c;还需具备低延迟、高吞吐…

作者头像 李华