Java集合详解——TreeSet集合的介绍及其排序

2023-11-11

一、TreeSet集合的自动排序

TreeSet集合的继承结构图

1、TreeSet集合使用红黑树数据结构实现元素的排序和存储,底层实际上是一个TreeMap集合

2、Tree Map集合底层实际上是一个二叉树。

3、放到TreeSet集合中的元素,等同于放到TreeMap集合中去了。

4、放到TreeSet集合中的元素:有序且唯一,即不可重复,有序是指可以按照元素的大小顺序自动排序。

5、TerrSet不允许插入null 元素,否则报空指针异常。

6、高效性能: 由于底层数据结构的特点,TreeSet 提供了高效的插入、删除和查找操作。它的时间复杂度通常是 O(log n),其中 n 是集合的大小。

7、可导航性: TreeSet 提供了一系列方法,如 first()、last()、lower()、higher()、ceiling()、floor() 等,用于在集合中查找元素或获取与给定元素最接近的元素。

8、不可变性: TreeSet 是不可变的集合,一旦创建,它的内容不可修改。如果需要对集合进行修改,可以创建一个新的 TreeSet 并复制元素。

TreeSet集合的常用构造方法
方法名 描述
TreeSet()
构造一个新的空 TreeSet 集合,根据其元素的自然顺序进行排序
TreeSet(Comparator<?
super E> comparator)
构造一个新的空 TreeSet 集合,根据指定的比较器进行排序
TreeSet(Collection<?
extends E> c)
构造一个新的 TreeSet 集合,,该 TreeSet 集合包含指 定集合中的元素,并根据其元素的自然顺序进行排序。
import java.util.*;
public class test03 {
    public static void main(String[] args) throws Exception {
        TreeSet<String> ts = new TreeSet<>();
        ts.add("a");
        ts.add("b");
        ts.add("zhangsan");
        ts.add("laoliu");
        ts.add("老六");
        ts.add("zhangss");
// 字符串默认重写了compare方法
        for (Object i:ts) {
            System.out.println(i);
        }
        System.out.println("--------------------------");
        TreeMap tm = new TreeMap();
        tm.put(1,"zhangsan");
        tm.put(2,"lisi");
        tm.put(2,"liss");
        tm.put(3,"lisi");
        Set<Map.Entry> set = tm.entrySet();
        for (Map.Entry i:set) {
            System.out.println(i);
        } 
    }
}

运行结果:  a
                    b
                    laoliu
                    zhangsan
                    zhangss
                    老六
                    --------------------------
                    1=zhangsan
                    2=liss
                    3=lisi

9、放到TreeSet或者TreeMap集合key部分中的元素要想做到排序,包括两种方式:

  • 第一种:放在集合中的元素实现java.lang.Comparable接口

  • 第二种:在构造TreeSet或者TreeMap集合的时候给它传一个比较器对象

    • 下面就分别介绍一下这两种方式的实现。

二、TreeSet集合自定义类型排序

TreeSet集合无法对自定义类型排序:出现这种情况的原因是没有实现java.lang.comParable接口

这里的排序规则可参考下图所示的自平衡二叉树的讲解原理:

自平衡二叉树的图示

 所以需要实现comParable接口,代码实现如下所示:

import java.util.*;
public class test03 {
    public static void main(String[] args){
        person p = new person(12);
        person p1 = new person(52);
        person p2 = new person(102);
        person p3 = new person(92);
        TreeSet ts = new TreeSet<>();
        ts.add(p);
        ts.add(p1);
        ts.add(p2);
        ts.add(p3);
        for (Object i:ts ) {
            System.out.println(i);
        }

    }
}
//放在Treeset集合中的元素需要实现comParable接口。
//并且实现comParaTo方法,equals可以不写。。
class person implements Comparable<person>{
    int age;
    public person(int age){
        this.age=age;
    }
//需要重写这个方法,编写比较的逻辑或规则,
    //k.comParaTo(t.key)
    //拿着参数k和集合中的每一个key进行比较,返回值可能是>0,<0,=0;
    //比较规则最终还是由程序员决定:例如按年龄升序或者降序。
    @Override
    public int compareTo(person c) {//c1.comParaTo(c2);
        //this是c1
        //c是c2
        //c1和c2比较的时候,就是this和c比较
       /* int age1 = this.age;
        int age2 = c.age;
        if (age1 ==age2){
            return 0;
        } else if (age1 >age2) {
            return 1;
        } else{
            return -1;
        }*/
        //也可以直接写成下面的这种形式
        //return this.age-c.age;//   =,<0,>0    升序
        return c.age-this.age;      //降序
    }
    public String toString(){
        return "person[age="+age+"]";
    }
}

运行结果:person[age=12]

                 person[age=52]

                 person[age=92]

                 person[age=102]

三、TreeSet集合中的元素可排序的第二种方式:使用比较器的方式。 

import java.util.*;
//排序的第二种方式:使用比较器的方式
public class test03 {
    public static void main(String[] args){
        person p = new person(12);
        person p1 = new person(52);
        person p2 = new person(102);
        person p3 = new person(92);
        //创建TreeSet集合的时候,一定要给构造方法传递一个比较器
        TreeSet<person> ts = new TreeSet<>(new PersonComparator());
        //这里也可以使用创建匿名内部类的方式:
        /*TreeSet<person> ts = new TreeSet<>(new Comparator<person>(){
            @Override
            public int compare(person o1, person o2) {
                return o1.age - o2.age;
            }
        });*/
        ts.add(p);
        ts.add(p1);
        ts.add(p2);
        ts.add(p3);
        for (Object i:ts ) {
            System.out.println(i);
        }
    }
}
//单独在这里写一个比较器
//比较器实现java.util.Comparator接口
class person{
    int age;
    public person(int age){
        this.age=age;
    }
    public String toString(){
        return "person[age="+age+"]";
    }
}
//比较器
class PersonComparator implements Comparator<person>{
    @Override
    public int compare(person o1, person o2) {
        //按照年龄排序
        return o1.age-o2.age;
    }
}

 运行结果:

  •   person[age=12]
      person[age=52]
      person[age=92]
      person[age=102]

Comparable接口和Comparator怎么选择呢?

  • 当比较规则不会发生改变的时候,或比较规则只有1个的时候,建议实现Comparable接口。

  • 如果比较规则有多个的时候,并且需要多个比较规则之间频繁切换,建议使用Comparator比较器。

Comparator的设计符合OCP原则。。

支持:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java集合详解——TreeSet集合的介绍及其排序 的相关文章

  • Oracle的服务器JRE包含JDK?

    我刚刚下载了适用于 Java SE 7 的 Oracle Server JRE link http www oracle com technetwork java javase downloads server jre7 downloads
  • 如何通过无头活动处理静默 SEND 意图

    正如提问的用户所说 Android 上的默认浏览器如何发送 SEND 意图 https stackoverflow com questions 3320930 how does the default browser on android
  • 区域设置的 Java 日期格式

    我怎样才能找到DateFormat对于给定的Locale DateFormat getDateInstance int Locale 例如 import static java text DateFormat DateFormat f ge
  • 使用递归查找数组中的最大值

    对于我被要求解决的问题之一 我使用 for 循环找到了数组的最大值 所以我尝试使用递归来找到它 这就是我想到的 public static int findMax int a int head int last int max 0 if h
  • 在远程 Tomcat 上自动部署 Java 应用程序

    我希望能够自动将 Java 应用程序部署到 tomcat 服务器 现在的情况 正在 Eclipse 中开发 Java 项目 Tomcat 服务器在另一台机器上运行 提供该项目的 WAR 文件 我的目标 可以轻松编译项目并将其部署到远程 To
  • Eclipse 构建 Android 应用程序:如何在编译时创建两个版本?

    我正在编写一个 Android 应用程序 并希望基于相同的代码创建两个版本 免费版本和高级版本 我有两个版本的一个代码库 具有各种运行时检查来启用或禁用某些功能 例如 public class MyAppContext extends Ap
  • Android WebView - 带有经过身份验证的代理

    我目前正在尝试调试围绕 WebView 构建的 Android 应用程序 我负责处理的开发网络环境 不是我的选择 这是 企业 安全决策 是WPA WiFi 代理服务器 代理身份验证 虽然a上的说明以前的答案非常有帮助 https stack
  • 在进行字符识别之前使用 OpenCV 进行图像预处理(超正方体)

    我正在尝试开发简单的 PC 应用程序用于车牌识别 Java OpenCV Tess4j 图像不是很好 进一步它们会很好 我想对超立方体图像进行预处理 但我被困在车牌检测 矩形检测 上 我的步骤 1 源图像 Mat img new Mat i
  • 我的 Java Web 应用程序中的 ClassNotFoundException/NoClassDefFoundError

    我使用 Java 开发了一个 Web 应用程序 当我将其部署到我的应用程序服务器 Jetty Tomcat JBoss GlassFish 等 时 会抛出错误 我可以在堆栈跟踪中看到此错误消息 java lang ClassNotFound
  • 递归 - 与 Java 中不重复的数组相结合

    所以我知道如何获取组合的大小 数组大小 在我的例子中 除以所需数组子集大小的阶乘 我遇到的问题是获取组合 到目前为止 我已经阅读了 stackoverflow 上的大部分问题 但一无所获 我认为我发现的问题是我想将创建的组合子集中的元素添加
  • Android Studio 1.0.1 APK META-INF/DEPENDENCIES 中复制的重复文件

    我安装了 Android Studio 版本 1 0 1 并尝试将我的项目从 eclipse 导入到它 它给了我以下错误 Error Execution failed for task app packageDebug Duplicate
  • Android文件上传器与服务器端php

    我几个小时以来一直在寻找解决方案 但找不到任何解决方案 基本上 我想从我的 Android 设备上传文件到 http 网站 但是 我不知道如何做到这一点 我在设备上使用java 并且我想在服务器端使用PHP 我只想上传文件 而不是在服务器上
  • Spring - 使用 new 是一种不好的做法吗?

    正在创建对象by hand 即使用new操作员而不是注册Springbean 和使用依赖注入被认为是不好的做法吗 我的意思是 确实Spring IoC容器必须了解应用程序中的所有对象吗 如果是这样 为什么 你希望 Spring 创建 bea
  • 如何在 selenium Chrome 功能中设置默认下载目录?

    请查找以下具有 chrome 功能的代码 事实上浏览器并没有将文件下载到指定的路径 private static DesiredCapabilities getChromeCapabilities throws Exception Stri
  • 使用 getPathMatcher 的全局模式

    从 OCP 考试的 Kathy Sierra Bert Bates 书中我找到了以下代码 public class FileTest public static void matches Path path String glob Path
  • 在可序列化 Java 类中使用记录器的正确方法是什么?

    我有以下 doctored 我正在开发的系统中的类以及Findbugs http findbugs sourceforge net 正在生成一个SE BAD FIELD http findbugs sourceforge net bugDe
  • Spring-WS WSDL生成问题

    我正在尝试制作一个非常简单的 Web 服务 但在让 spring 生成正确的 wsdl 时遇到一些困难 我已尽力复制此示例春季教程 http static springsource org spring ws sites 2 0 refer
  • 如何在jsf页面中嵌入java代码?

    我有 一个名为 LoginBean 的托管 bean 名为 login xhtml 的 JSF 页面 在这个 jsf 页面中 我有一个登录表单 在managebean 内部我有一个loginCheck 函数 public void logi
  • 有没有办法在坐标平面上动态绘制点之间的线?

    我正在完成一个项目 在该项目中我实现了一个暴力算法来解决凸包问题 我还需要为该算法创建视觉效果 我试图在 x 轴和 y 轴上创建一个范围从 100 100 的坐标平面 绘制完整集中的所有点 并在点之间动态绘制线条以创建凸包 例如 假设我有
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但

随机推荐

  • Ubuntu12.0.4 安装xmpp 服务器ejabberd

    http www cnblogs com dyingbleed archive 2013 04 04 2999885 html
  • 计算机图形学常用算法实现3 多边形扫描转换算法-扫描线算法

    运行环境 vs2015 winform 其他环境只需要替换对应的画点画线算法即可 这个算法其实很复杂的 实现起来需要有耐心 一步一步按照算法思路来写代码 在算法中 我使用的是静态链表 c 没有指针 下面的AET为活性边表 NET存储新边表
  • JS 数组转其他格式

    let arr 1 2 const arr 1 2 const newArr arr map item gt return key item value item console log newArr key 1 value 1 key 2
  • PyTorch学习笔记9

    PyTorch学习笔记9 整理笔记视频来源 问答系统 文本摘要系统 大规模预训练语言模型 一 问答系统 SQuAD数据集 给定一段文字作为context 给定一个问题question 从context中寻找一段连续的文字 text span
  • 毕业三周年,又一个离别季

    今天应该算是一个特别的日子 2011年的6月23日 我正式离校了 当时分别的场景还依稀在眼前展现 虽然我们没有跟别人一样哭的稀里哗啦 但是谁心里都明白 以后见面的日子真的不会太多 今天是2014年6月23日 看着很多人在空间发表大学生涯结束
  • 【超分顶会详解+部署】ESRT:Transformer for Single Image Super-Resolution

    文章目录 ESRT 1 超分基本知识 1 1 SRF 1 2 xxx img 1 3 裁剪 1 4 超分模型评估标准 2 LCB LTB 模块 2 1 序列模型 3 损失函数 4 部署运行 4 1 数据集 4 1 1 训练集 4 1 2 验
  • [专利与论文-19]:江苏省南京市2022年电子信息申报通知(中、高级)

    官网地址 南京人力资源和社会保障学会 官网通知 南京人力资源和社会保障学会 申报时间 2022 6 21到2022 07 29 过时不候 2021年申报地址 网上学习 江苏人社网办大厅 南京人社网上办事大厅 2022年申报地址 江苏省人力资
  • 华为OD机试 - We Are A Team

    题目描述 总共有 n 个人在机房 每个人有一个标号 1 lt 标号 lt n 他们分成了多个团队 需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中 具体的 消息构成为 a b c 整数 a b 分别代表两个人的标号 整数 c 代
  • 计算机日期函数公式大全,常用的Excel日期函数大全

    Excel日期大家都会用 但是你知道Excel中有多少日期和时间函数吗 Excel为我们提供了大约20个日期和时间函数 这些函数对于处理表格中的日期数据都是非常有用的 下面介绍几个常用的Excel日期函数及其实际应用案例 1 处理动态日期
  • 对区块链的分析理解

    概述 狭义来讲 区块链是一种按照时间顺序将数据区块以链条的方式组合成特定数据结构 并以密码学方式保证的不可篡改和不可伪造的去中心化共享总账 Decentralized shared ledger 能够安全存储简单的 有先后关系的 能在系统内
  • PowerOJ2512: 小红灌溉【染色】

    题目链接 划重点 每个有菜的点只能浇一次且恰好一次 所以意思就是 譬如某个菜的位置是 x y 那么 行x 列y的浇水方案只能使用其中的一个 以此类推 我们给每个有蔬菜的位置的 x y 的x点与y点链接一条无向边 代表x和y只能选择其中的一个
  • MySQL5.7.xx安装卡在Staring the server解决方案--亲测有效

    安装mysql时卡在Staring the server 一般是两个问题 之前安装过mysql 卸载不彻底 你的电脑名称中有中文 我当时用在网上查找的方法 将mysql删除之后 依旧卡在Staring the server这个地方 接着重新
  • 《数据分析原理》:6步解决业务分析难题

    点击上方卡片关注我 回复 8 加入数据分析 领地 一起学习数据分析 持续更新数据分析学习路径相关资料 精彩数据观点 学习资料 数据课程分享 读书会 分享会等你一起来乘风破浪 回复 小飞象 领取数据分析知识大礼包 读书交流 7期 数据分析原理
  • IntelliJ IDEA 下载安装教程,超详细图文教程

    1 IDEA 下载 1 打开浏览器输入https www jetbrains com 进入 Jetbrains官网 点击 Developer Tools 再点击 Intellij IDEA 2 点击中间的 Download 进入IDEA下载
  • 分割预研 -- 2022.5

    MMSegmentation MMSegmentation 标准统一的语义分割框架 非常好的分割开源集成框架 https link zhihu com target https 3A github com open mmlab mmsegm
  • 基于 FBXSDK-Python 的动画操作

    PythonFBXSKD 01 基础的动画操作 1 0 下载安装 FBXSDK 我这里演示的是 FBXSDK 2020 2 只有 py37 版本的 FBXSDK 2020 1 1 版本有 py27 和py33 两个版本 根据自己的pytho
  • kubernetes的configmap格式错乱问题

    一 问题 最近发现configmap资源在查看 o yaml 或者修改 edit 时 存在格式错乱问题 以nginx配置文件为例 通过
  • 点对点隧道协议—PPTP部署配置

    1 虚拟专用网 1 1 PPTP介绍 PPTP Point to Point Tunneling Protocol 即点对点隧道协议 该协议是在PPP协议的基础上开发的一种新的加强型安全协议 支持多协议虚拟专用网 能够经过密码验证协议 PA
  • 微服务方法论02--服务划分规则01

    背景 现在微服务比较流程 那么对于微服务的拆分方法也比较让人困惑 本文从不同的角度切入后以系统的 全面的 统一的方式为各位介绍服务拆分的问题 问题定义 服务划分具体的问题在哪里 服务划分是对于具体技术的选择 是选择使用纵向切割的方式 还是使
  • Java集合详解——TreeSet集合的介绍及其排序

    一 TreeSet集合的自动排序 TreeSet集合的继承结构图 1 TreeSet集合使用红黑树数据结构实现元素的排序和存储 底层实际上是一个TreeMap集合 2 Tree Map集合底层实际上是一个二叉树 3 放到TreeSet集合中
Powered by Hwhale