当前位置: 首页 > news >正文

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,表示当前存入的元素跟集合中元素重复了,不存

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

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

http://www.jsqmd.com/news/260168/

相关文章:

  • 5个YOLOv9部署教程推荐:一键镜像开箱即用,省时提效
  • Qwen3-VL-2B对比Blip-2:轻量级模型部署体验评测
  • MGeo真实体验分享:地址匹配准确率提升40%
  • 超详细版对比USB 3.0 3.1 3.2在移动硬盘中的实际表现
  • 架构演进:从数据库“裸奔”到多级防护
  • Qwen3-1.7B微调前后对比,效果提升一目了然
  • 从口语到标准格式|用FST ITN-ZH镜像实现中文逆文本精准转换
  • 边缘太生硬?开启羽化让AI抠图更自然流畅
  • Wan2.2部署实战:医疗科普动画AI生成的内容合规性把控
  • Qwen3-Embedding-4B省钱策略:低峰期调度部署方案
  • Qwen3-Embedding-4B镜像推荐:开箱即用的向量服务方案
  • 小白必看!一键配置Linux开机启动脚本的保姆级指南
  • 企业级应用:BERT语义填空服务部署最佳实践
  • Qwen2.5-7B显存优化方案:16GB GPU高效运行实战
  • 亲测PyTorch-2.x-Universal-Dev-v1.0镜像,Jupyter开箱即用太省心
  • 自动化翻译平台开发:HY-MT1.5-7B全流程集成指南
  • Unsloth与Hugging Face生态无缝集成使用体验
  • 亲测PETRV2-BEV模型:星图AI平台训练3D检测效果超预期
  • 【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock 1.0
  • Java SpringBoot+Vue3+MyBatis 保信息学科平台系统源码|前后端分离+MySQL数据库
  • 混元翻译模型再升级|HY-MT1.5-7B本地化部署全攻略
  • 告别Whisper!SenseVoiceSmall中文识别快又准
  • 企业级大学城水电管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • PyTorch-2.x-Universal-Dev-v1.0部署教程:将本地代码同步到远程容器
  • 实战应用:用Whisper-large-v3快速搭建智能会议记录系统
  • 企业级海滨学院班级回忆录设计与实现管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Emotion2Vec+ Large粤语识别差?区域语言微调建议
  • Java Web 精品在线试题库系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • Java SpringBoot+Vue3+MyBatis 新闻稿件管理系统系统源码|前后端分离+MySQL数据库
  • 低成本实现风格迁移,麦橘超然LoRA微调初体验