Java集合框架篇-62-TreeSet比较器排序原理和代码实现

2024-06-11 11:38

本文主要是介绍Java集合框架篇-62-TreeSet比较器排序原理和代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      前面我们知道了,TreeSet集合在存储元素的时候,会先调用compareTo方法,然后决定如何存储。下面,先看看一个需求的实现过程,然后介绍什么是比较器和如何具体实现。

1.字符串按照长度排序

       我们已经知道,默认是按照unicode码表的字典排序输出,例如下面TreeSet集合存储的是String对象,就按照字典a到z的顺序排序。

package treeset;import java.util.TreeSet;public class Demo4_TreeSet {public static void main(String[] args) {TreeSet<String> ts = new TreeSet<>();ts.add("aaaaa");ts.add("z");ts.add("nba");ts.add("cba");ts.add("beijing");System.out.println(ts);}}

运行输出:

[aaaaa, beijing, cba, nba, z]

       运行结果并没有按照字符串长度进行排序显示,而是按照字典排序,说明在String类里的compareTo()方法是根据字典排序。接下来我们介绍TreeSet中第二个排序方法,叫比较器排序。打开TreeSet API文档,找到TreeSet(Comparator<? super E> comparator)

       这个构造方法,参数就是传一个比较器,搜索Comparator,发现是一个接口,下面有两个方法,一个是compareTo和equals方法。下面我们需要新建一个类来实现Comparator接口,并设计按照字符串长度排序。

package treeset;import java.util.Comparator;
import java.util.TreeSet;public class Demo4_TreeSet {public static void main(String[] args) {TreeSet<String> ts = new TreeSet<>(new CompareByLength());ts.add("aaaaa");ts.add("z");ts.add("nba");ts.add("cba");ts.add("beijing");System.out.println(ts);}}class CompareByLength implements Comparator<String> {@Overridepublic int compare(String s1, String s2) {int num = s1.length() - s2.length();	//长度比较是主要条件return num==0? s1.compareTo(s2) : num;	//如果长度一样,然后再按照字典排序}}

运行结果:

[z, cba, nba, aaaaa, beijing]

     输出结果体现了先按字符串长度比较,然后按照字符的字典顺序排序。CompareByLength就是一个我们自定义的比较器,作为类型是String类型,里面重写了compare(ob1, ob2)。


2.TreeSet的原理

TreeSet是通过以下两种排序方式保证元素的唯一性。

1.自然排序(字典顺序)

1)TreeSet类的add()方法中会把存入的对象提升为Comparable类型
2)调用对象的compareTo()方法和集合已有对象比较
3)根据compareTo()方法返回的结果进行存储

2.比较器排序

1)创建TreeSet的时候可以指定一个comparator(比较器)
2)如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序
3)add()方法内部会自动调用Comparator接口中compare()方法来排序

两种的区别:

1)TreeSet构造函数什么都不传,默认按照Comparable的顺序
2)TreeSet如果传入Comparator,就优先按照比较器排序

这篇关于Java集合框架篇-62-TreeSet比较器排序原理和代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051061

相关文章

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Spring Cache注解@Cacheable的九个属性详解

《SpringCache注解@Cacheable的九个属性详解》在@Cacheable注解的使用中,共有9个属性供我们来使用,这9个属性分别是:value、cacheNames、key、key... 目录1.value/cacheNames 属性2.key属性3.keyGeneratjavascriptor

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Kali Linux安装实现教程(亲测有效)

《KaliLinux安装实现教程(亲测有效)》:本文主要介绍KaliLinux安装实现教程(亲测有效),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载二、安装总结一、下载1、点http://www.chinasem.cn击链接 Get Kali | Kal

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,