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.mzph.cn/news/1175560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

5个YOLOv9部署教程推荐:一键镜像开箱即用,省时提效

5个YOLOv9部署教程推荐&#xff1a;一键镜像开箱即用&#xff0c;省时提效 1. 镜像环境说明 本镜像基于 YOLOv9 官方代码库构建&#xff0c;预装了完整的深度学习开发环境&#xff0c;集成了训练、推理及评估所需的所有依赖&#xff0c;开箱即用。适用于快速开展目标检测任务…

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

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

MGeo真实体验分享:地址匹配准确率提升40%

MGeo真实体验分享&#xff1a;地址匹配准确率提升40% 1. 引言&#xff1a;中文地址匹配的挑战与MGeo的突破 在地理信息处理、物流调度、城市计算等实际业务场景中&#xff0c;地址相似度匹配是一项基础但极具挑战性的任务。其核心目标是判断两条文本形式的地址是否指向现实世…

超详细版对比USB 3.0 3.1 3.2在移动硬盘中的实际表现

为什么你的移动硬盘跑不满标称速度&#xff1f;一文看懂USB 3.0、3.1、3.2的真实差距你有没有遇到过这种情况&#xff1a;花大价钱买了个“高速NVMe移动固态硬盘”&#xff0c;包装上赫然写着“传输速度高达2000MB/s”&#xff0c;结果插上电脑一测&#xff0c;读写连1000都不到…

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

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

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

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

从口语到标准格式|用FST ITN-ZH镜像实现中文逆文本精准转换

从口语到标准格式&#xff5c;用FST ITN-ZH镜像实现中文逆文本精准转换 在语音识别和自然语言处理的实际应用中&#xff0c;一个常被忽视但至关重要的环节是逆文本标准化&#xff08;Inverse Text Normalization, ITN&#xff09;。当用户说出“二零零八年八月八日”或“早上八…

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

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

Wan2.2部署实战:医疗科普动画AI生成的内容合规性把控

Wan2.2部署实战&#xff1a;医疗科普动画AI生成的内容合规性把控 1. 引言 随着人工智能技术的快速发展&#xff0c;文本到视频&#xff08;Text-to-Video&#xff09;生成模型在内容创作领域展现出巨大潜力。特别是在医疗科普场景中&#xff0c;如何高效、准确且合规地生成可…

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

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

Qwen3-Embedding-4B省钱策略:低峰期调度部署方案

Qwen3-Embedding-4B省钱策略&#xff1a;低峰期调度部署方案 1. 背景与问题提出 在大规模语言模型日益普及的今天&#xff0c;向量嵌入服务已成为检索增强生成&#xff08;RAG&#xff09;、语义搜索、推荐系统等应用的核心基础设施。Qwen3-Embedding-4B 作为通义千问系列中专…

小白必看!一键配置Linux开机启动脚本的保姆级指南

小白必看&#xff01;一键配置Linux开机启动脚本的保姆级指南 1. 引言&#xff1a;为什么需要开机启动脚本&#xff1f; 在实际的 Linux 系统运维和开发中&#xff0c;我们常常需要某些程序或脚本在系统启动时自动运行。例如&#xff1a; 启动一个后台服务&#xff08;如 Py…

Qwen2.5-7B显存优化方案:16GB GPU高效运行实战

Qwen2.5-7B显存优化方案&#xff1a;16GB GPU高效运行实战 1. 引言 1.1 业务场景描述 随着大语言模型在实际应用中的广泛落地&#xff0c;如何在有限硬件资源下高效部署高性能模型成为工程团队的核心挑战。通义千问Qwen2.5-7B-Instruct作为最新一代70亿参数级别的指令微调模…

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

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

亲测PyTorch-2.x-Universal-Dev-v1.0镜像,Jupyter开箱即用太省心

亲测PyTorch-2.x-Universal-Dev-v1.0镜像&#xff0c;Jupyter开箱即用太省心 1. 镜像核心价值与使用场景 在深度学习开发过程中&#xff0c;环境配置往往是最耗时且最容易出错的环节。无论是依赖版本冲突、CUDA驱动不匹配&#xff0c;还是Jupyter内核无法识别虚拟环境&#x…

自动化翻译平台开发:HY-MT1.5-7B全流程集成指南

自动化翻译平台开发&#xff1a;HY-MT1.5-7B全流程集成指南 1. 引言 随着全球化进程的加速&#xff0c;跨语言沟通已成为企业、开发者乃至个人日常工作的核心需求。传统商业翻译API虽然成熟&#xff0c;但在定制性、成本控制和数据隐私方面存在局限。近年来&#xff0c;开源大…

Unsloth与Hugging Face生态无缝集成使用体验

Unsloth与Hugging Face生态无缝集成使用体验 1. 引言&#xff1a;高效微调时代的到来 在大语言模型&#xff08;LLM&#xff09;快速发展的今天&#xff0c;如何以更低的成本、更高的效率完成模型的定制化微调&#xff0c;成为开发者和研究者关注的核心问题。Unsloth作为一款…

【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock 1.0

【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock 二、详细区别分析 1. 实现层面 synchronized&#xff1a; Java 关键字&#xff0c;由 JVM 底层实现&#xff08;通过 monitorenter/monitorexit 字节码指令&#xff09;。 锁信息记录在对象头的 Mark Word 中。…

亲测PETRV2-BEV模型:星图AI平台训练3D检测效果超预期

亲测PETRV2-BEV模型&#xff1a;星图AI平台训练3D检测效果超预期 1. 引言&#xff1a;BEV感知新范式下的高效训练实践 随着自动驾驶技术的快速发展&#xff0c;基于多摄像头图像的鸟瞰图&#xff08;Birds Eye View, BEV&#xff09;感知已成为3D目标检测的核心方向。传统方法…