news 2026/4/18 13:48:34

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/18 5:20:47

SGLang-v0.5.6环境部署:Ubuntu下CUDA兼容性避坑指南

SGLang-v0.5.6环境部署&#xff1a;Ubuntu下CUDA兼容性避坑指南 1. 引言 随着大语言模型&#xff08;LLM&#xff09;在实际业务场景中的广泛应用&#xff0c;如何高效、稳定地部署模型推理服务成为工程落地的关键挑战。SGLang-v0.5.6作为新一代结构化生成语言推理框架&#…

作者头像 李华
网站建设 2026/4/18 5:22:28

零基础玩转SGLang,轻松实现AI任务编排

零基础玩转SGLang&#xff0c;轻松实现AI任务编排 1. 引言&#xff1a;为什么需要SGLang&#xff1f; 大模型&#xff08;LLM&#xff09;的广泛应用正在推动AI系统从“简单问答”向“复杂任务执行”演进。然而&#xff0c;在实际部署中&#xff0c;开发者常常面临诸多挑战&a…

作者头像 李华
网站建设 2026/4/18 11:04:42

避坑指南:RexUniNLU中文NLP部署常见问题全解

避坑指南&#xff1a;RexUniNLU中文NLP部署常见问题全解 1. 引言&#xff1a;为什么选择 RexUniNLU&#xff1f; 在中文自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;信息抽取是构建智能系统的核心能力之一。传统方法往往需要针对命名实体识别&#xff08;NER&…

作者头像 李华
网站建设 2026/4/18 8:31:05

资源受限设备也能跑大模型?AutoGLM-Phone-9B部署实测分享

资源受限设备也能跑大模型&#xff1f;AutoGLM-Phone-9B部署实测分享 随着多模态大语言模型&#xff08;MLLM&#xff09;在视觉理解、语音交互和文本生成等任务中的广泛应用&#xff0c;其对算力和存储资源的高要求一直限制着在移动端和边缘设备上的落地。然而&#xff0c;Au…

作者头像 李华
网站建设 2026/4/18 13:35:39

Qwen3-4B-Instruct-2507实战:UI-TARS-desktop快速部署指南

Qwen3-4B-Instruct-2507实战&#xff1a;UI-TARS-desktop快速部署指南 1. UI-TARS-desktop简介 1.1 Agent TARS 核心定位 Agent TARS 是一个开源的多模态 AI Agent 框架&#xff0c;致力于通过融合视觉理解&#xff08;Vision&#xff09;、图形用户界面操作&#xff08;GUI…

作者头像 李华
网站建设 2026/4/17 13:26:47

Qwen3-Embedding-4B镜像推荐:开箱即用的向量服务方案

Qwen3-Embedding-4B镜像推荐&#xff1a;开箱即用的向量服务方案 1. 背景与需求分析 随着大模型在检索增强生成&#xff08;RAG&#xff09;、语义搜索、多模态理解等场景中的广泛应用&#xff0c;高质量文本嵌入&#xff08;Text Embedding&#xff09;能力已成为构建智能系…

作者头像 李华