news 2026/4/23 9:32:01

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/4/23 9:31:00

从零开始规划LED显示屏安装:新手必看入门指南

从零搭建一块LED屏&#xff1a;一个工程师的实战入门笔记最近接手了一个商场中庭的LED屏项目&#xff0c;客户要求两周内完成安装调试。作为第一次独立负责这类工程的新手&#xff0c;我翻遍了厂商手册、技术文档和行业论坛&#xff0c;才总算把整个流程理清楚。今天想用最“人…

作者头像 李华
网站建设 2026/4/20 1:45:42

打工人必备!免费好用还简单的5款AI PPT工具推荐

打工人必备&#xff01;免费好用还简单的 6 款 AI PPT 工具推荐 作为一名在职场摸爬滚打多年的打工人&#xff0c;我深知做 PPT 的痛苦。好不容易加班加点把内容准备好&#xff0c;却要面对从空白页开始搭建大纲、拆分页面和理顺逻辑的难题。更要命的是&#xff0c;有时候 PPT…

作者头像 李华
网站建设 2026/4/23 9:30:49

打工人必备!免费好用、简单上手的5款AI PPT工具推荐

打工人必备&#xff01;免费好用、简单上手的 6 款 AI PPT 工具推荐作为一名在职场摸爬滚打多年的打工人&#xff0c;我深知做 PPT 的痛苦。好不容易熬到下班&#xff0c;准备开启快乐时光&#xff0c;突然领导来一句“明天的汇报 PPT 抓紧做出来”&#xff0c;瞬间心情就像掉进…

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

企业级应用:BERT语义填空服务部署最佳实践

企业级应用&#xff1a;BERT语义填空服务部署最佳实践 1. 引言 1.1 业务场景描述 在现代企业级自然语言处理&#xff08;NLP&#xff09;应用中&#xff0c;语义理解能力正成为智能客服、内容辅助创作、教育测评等系统的核心竞争力。其中&#xff0c;语义填空作为一种典型的…

作者头像 李华
网站建设 2026/4/23 9:32:00

Qwen3-1.7B微调前后对比,效果提升一目了然

Qwen3-1.7B微调前后对比&#xff0c;效果提升一目了然 1. 引言&#xff1a;为何要对Qwen3-1.7B进行微调&#xff1f; 随着大语言模型在垂直领域应用的不断深入&#xff0c;通用预训练模型虽然具备广泛的知识覆盖能力&#xff0c;但在特定专业场景&#xff08;如医疗、法律、金…

作者头像 李华
网站建设 2026/4/17 20:23:39

边缘太生硬?开启羽化让AI抠图更自然流畅

边缘太生硬&#xff1f;开启羽化让AI抠图更自然流畅 1. 背景与技术痛点 在图像处理、电商展示、社交媒体内容创作等场景中&#xff0c;高质量的图像抠图是提升视觉表现力的关键环节。传统手动抠图依赖专业设计工具和大量人力操作&#xff0c;效率低下&#xff1b;而早期自动抠…

作者头像 李华