黑马程序员_日记43_初学TreeSet

QQ的TEA填充算法C#实现 By Red_angelX 注:本人只是从LUMA QQ的 Source Code里面把相应Java语言翻译成C#,纯技术研究,并没有对TC产品做任何逆向分析,不承担任何法律责任!转载请保持本文完整性网上有c/c++,vb,delphi,java,perl各种版本的tea填充算法,唯独没有C#的,这让我这种狂热喜爱C#的人如何承受,于是,花3天时间看了各种代码经历无数失败的挫折终于用C#完成了该填充算法,废话不多说,直接 阅读详情

 ——- android培训、java培训、期待与您交流! ———-

TreeSet

通过学习HashSet,我们发现HashSet元素迭代顺序和元素存入顺序是不一致的,
而且通过查阅API发现:
“它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。”
这就是说在大量迭代取出测试后,迭代顺序还有可能发生变化!!!

那么Set是否就一定是无序的呢??
答案是否定的!
TreeSet就弥补了HashSet无序的缺点!
查阅API:
“使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。”

我们发现TreeSet是可以对Set集合中元素进行自然排序的。
那么什么叫做自然排序呢??
查阅Comparable接口API:
“此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。”

既然TreeSet会自然排序,那么我们先演示一下吧!
需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。

思路:
1 把数据存入学生对象–>抽象出Student类
2 创建TreeSeet集,同时把Student对象存入
3 打印,观察,分析

import java.util.*;

//学生类
class Student
{
    private String name;//学生姓名
    private int age;//学生年龄

    //构造函数传递参数
    Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public int getAge()
    {
        return age;
    }
}

//主类
class TreeSetDemo
{
    public static void main(String[] args)
    {
        //1 创建TreeSet集合
        TreeSet ts = new TreeSet();

        //2 添加学生对象
        ts.add(new Student("Jack",20));
        ts.add(new Student("Jane",21));
        ts.add(new Student("Jimmy",20));
        ts.add(new Student("Jone",15));
        ts.add(new Student("Tom",26));
        ts.add(new Student("Jordan",16));

        //迭代取出
        for(Iterator it = ts.iterator(); it.hasNext(); )
        {
            //强制转换为Student对象
            Student stu = (Student)it.next();
            System.out.println(stu.getName()+"----"+stu.getAge());
        }
    }
}

这里写图片描述
编译通过了,但是不安去,暂不处理;
运行的时候出现了异常:ClassCastException类型转换异常:无法比较
Exception in thread “main” java.lang.ClassCastException: Student cannot be cast
to java.lang.Comparable

当集合只添加1个Student对象时,迭代取出是可以的,不会出现异常。
但是当集合内有2个和2个以上的Student对象时,就会出现ClassCastException!
这是为什么呢????
还记得前面查阅API得到的信息吗??
TreeSet是可以对Set集合中元素进行自然排序的,而且这个动作是自动执行的,
这个比较动作是强制执行的!
但是从运行结果看,既然出现了ClassCastException,
这说明了Student不具有可比性!

那么接下来的问题就是:如何让Studeng类自身具备可比性!?

根据API的资料,Comparable接口中的int compareTo(obj)方法能够比较,
所以只要让Student类实现了该接口,Student自身就具备了可比性!
这其实也就是TreeSet排序的第一种方式:
让元素自身具备可比性,该元素所属类必须实现Comparable接口,
并且覆盖compareTo方法,这种方式就是自然排序!
值得注意的是:Comparable接口内就只有这么一种方法,它不存在第二种方法。

下面接着上面的思路:
4 Student类实现Comparable接口,并覆盖comparTo()方法—让Student自身具备可比性
5 打印,观察,分析

import java.util.*;

//学生类实现Comparable接口,并覆盖comparTo()方法---让Student自身具备可比性
class Student implements Comparable
{
    private String name;//学生姓名
    private int age;//学生年龄

    //构造函数传递参数
    Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public int compareTo(Object obj)
    {
        //强制类型转换为Student
        Student s = (Student)obj;

        //利用Integer中的compareTo方法进行比较学生年龄
        int num = new Integer(this.getAge()).compareTo(new Integer(s.getAge()));

        //返回两对象年龄比较结果
        return num;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    public int getAge()
    {
        return age;
    }
}

//主类
class TreeSetDemo
{
    public static void main(String[] args)
    {
        //1 创建TreeSet集合
        TreeSet ts = new TreeSet();

        //2 添加学生对象
        ts.add(new Student("Jack",20));
        ts.add(new Student("Jane",21));
        ts.add(new Student("Jimmy",20));
        ts.add(new Student("Jone",15));
        ts.add(new Student("Tom",26));
        ts.add(new Student("Jordan",16));

        //迭代取出
        for(Iterator it = ts.iterator(); it.hasNext(); )
        {
            //强制转换为Student对象
            Student stu = (Student)it.next();
            System.out.println(stu.getName()+"----"+stu.getAge());
        }
    }
}

这里写图片描述
运行结果:
Jone—-15
Jordan—-16
Jack—-20
Jane—-21
Tom—-26
现在已经成功的让Student自身具备了可比性,
根据年龄去除重复元素已经成功实现了!
并且通过打印结果发现,TreeSet确实对学生对象的年龄进行了自然排序。

另外,对下面这段语句给出一些注解:
//利用Integer中的compareTo方法进行比较学生年龄
int num = new Integer(this.getAge()).compareTo(new Integer(s.getAge()));

Integer中的compareTo方法比较的是两个Integer对象,
所以要把学生年龄装箱!
学生年龄建议还是用get方法获取,这样安全。

5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字 (Java/Py/C/C++/Js/Go) 5.6华为OD机试真题 新系统 - 匹配命令行前缀关键字本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。 阅读详情

相关推荐

UDS $27服务DLL文件生成

UDS 27算法 DLL文件生成

hkj8808的博客 1282

【Java】TreeSet()详解

1.概述 在本文中,我们将介绍Java Collections Framework的一个组成部分,以及最受欢迎的Set实现之一 TreeSet。 2. TreeSet简介 简而言之,TreeSet是一个有序集合,它扩展了AbstractSet类并实现了NavigableSet接口。 以下是此实现最重要方面的快速摘要: 它存储唯一的元素 它不保留元素的插入顺序 它按升序对元素进行排序 它不是线程安...

beautiful_huang的博客 1万+

GSEA富集分析实战:从数据准备到结果解读的完整R代码指南

本文提供了一份完整的GSEA富集分析实战指南,涵盖从R环境准备、数据质量控制到基因ID转换、参数优化和结果解读的全流程。通过详细的R代码示例和实用技巧,帮助研究人员高效完成基因集富集分析,特别针对生物信息学中常见的GSEA分析痛点提供了专业解决方案。

weixin_29246195的博客 536

TreeSet详解

TreeSet详解

weixin_52385232的博客 1151

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

PCB设计中的cut out参考面早已是SI评估中常用的阻抗优化方式,通过合理的仿真建模,可以提供合适的设计参考,并保持与测试结果的高度一致性。

一只豌豆象的博客 1436

前言:关于作者吴秋生博士与此书简介

博士现为田纳西大学,诺克斯维尔分校,地理系的副教授。他的研究兴趣包括地理信息科学(GIS)、遥感和环境建模。更具体地说,对应用地理空间大数据、机器学习和云计算(例如,谷歌地球引擎、微软行星计算机)来研究环境变化,特别是地表水和湿地淹没动态。吴博士是开放科学和可重复研究的倡导者。他开发了几个用于高级地理空间分析的开源软件包(例如,吴博士还在YouTube上发布了数百个有关GIS和地图绘制的视频。更多有关他的开源项目信息,请访问GitHub(查看他的YouTube频道。.....................

韩天放 6087

java Set-----TreeSet类

TreeSet: * 基于 TreeMap 的 NavigableSet 实现。 * 1 使用元素的自然顺序对元素进行排序 使用空构造器 TreeSet ts= new TreeSet<>(); 2 或者根据创建 set 时提供的 Comparator 进行排序 * TreeSet ts= new TreeSet<>(Comparator c...

司天宏的博客 241

倍福--TwinSAFE功能块的使用

在安全模块的程序设计中,输入变量取反,或者把PLC的变量连接到安全的功能块程序中, 操作流程 1.1. 功能块输出取反 例如修改IN,右击属性,然后可在Single-Channel选项中选择是NO还是NC的输入信号。 1.2. PLC标准变量作为安全程序的输入 1.2.1. 建立两个PLC变量 1.2.2. 安全程序区创建变量 1.2.3. 功能块变量链接 首先,PLC变量不能直接连到Estop功能块的输入变量中,否则会报错,但PLC可以连接到SafeAnd这些功能块,然后再转出来,如下所示

weixin_41883890的博客 5310

TreeSet集合的使用

一、TreeSet的原理 TreeSet会对集合里的元素按照指定的顺序进行排序,它的底层数据结构依据的是红-黑二叉树, 1.1什么是红-黑二叉树? 就是二叉树的每个结点的左右孩子结点的值具有一定规律,即“左小右大” 1.2根据什么确定集合里元素的唯一性? 因为TreeSet会对集合里的元素进行指定顺序的排序,...

毛毛雨的博客 990

Excel 汉字首字母提取:四种方案对比与选型

本文对比了 Excel 中提取汉字首字母的四种方案:手动转换、VBA 脚本、映射表与 AI 工具。手动方式低效易错;VBA 适合无网环境但识别范围有限;映射表精度提升却无法解决多音字;AI 工具通过语义理解可一句话完成提取,是多数场景下的首选。

u011186532的专栏 394

Docker:快速部署 Temporal 工作流引擎的技术指南

Temporal是一个开源的分布式工作流引擎,适用于复杂业务流程(如订单处理、支付流程等),提供状态持久化、自动重试、多语言SDK支持等特性。部署简单,支持Docker Compose,包含核心服务、Web UI及数据库。以TypeScript为例,开发者可快速编写工作流(如订单处理)和Worker,通过CLI或SDK启动和管理。Temporal简化了分布式系统的可靠性设计,适合电商、自动化任务等场景。

木头 640

Java集合(十一)TreeSet解读

我们查看treeset的构造器的时候,发现TreeSet的构造器除了那种无参构造器之外,还提供了另外四种。就是把value值取出来,然后进行循环比较,如果发现不相等,就返回c1-c2,然后谁的ACCIS码值大,就返回大于0的值,否则返回小于0的值。Comparator是一个接口,他有一个方法叫compare,我们可以在他的compare方法指定他的一个排序规则。我们再次进入了TreeMap里面了,进入了TreeMap里面的put方法。这个构造器接收了一个comparator,这个接口的实现对象。

超级程序诞生的博客 1401

华为OD机试真题 新系统2026-04-08 C++ 实现【直捣黄龙】

小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个 哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。

MISAYAONE的博客 261

TreeSet的使用方法总结、实现原理、使用示例

HashMap的使用方法总结、实现原理、使用示例

一点光辉的博客 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java:Set集合中TreeSet的常用方法及其使用

TreeSet TreeSet类是实现Set接口的3个使用的类之一,是 Set 集合的实现类,因此它也具有元素唯一性和无序性,它的底层数据结构是 TreeMap 树结构,它确保元素的唯一性是通过 Compareable 接口的 compareto 方法,另外,它既是无序的,又是有序的。无序指的是存储元素顺序和输出顺序不同,有序指的是遍历集合时,输出的所有元素是有序的。 常用方法与HashSet相差无几,详情请参考java:Set集合中HashSet的常用方法及其使用 创建TreeSet集合 S

Xixicjj的博客 3279

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 集合之TreeSet详解

首先说明一下,之前看了一下文章提出TreeSet在添加第一个元素的时候是不比较大小的,这种说发是错误的,在第一次添加的时候比较的是第一个对象本省返回的参数是0,下面我们用程序验证一下:首先由一个Student的内部类:里面有两个参数,年龄和名称我们后期自定义排序也是用得到的。然后我们把这个对象添加到TreeSet中,构建一个无参数的TreeSet。这样添加我们是能看到程序报错:然后我们写一个自定义...

zhaojie181711的博客 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Set集合之TreeSet集合

TreeSet集合:可以对Set集合中的元素进行排序。是不同步i的。                        判断元素唯一性的方式:根据比较方法的返回值来判断。是0(零)就存入集合,不是0就不存。因为Set集合是不能有重复的元素,无序。                         既然是无序的集合。我们有时为了到达需求,需要使它变得有序,那怎么办呢?   TreeSet对元素排序的...

真香号 2万+

关于TreeSet集合的理解与使用

1、如何理解TreeSet集合? 若向TreeSet集合中添加整型数据,再通过迭代器遍历,可以发现数据都已经进行排序,仔细可发现为中序排序,或者为小顶堆。 @Test public void test(){ TreeSet treeSet = new TreeSet(); treeSet.add(-11); treeSet.add(1); treeSet.add(16); treeSet.add(6);

懵逼是一种状态的博客 550

java TreeSet的使用

/* TreeSet:它可以给Set集合中的元素进行指定方式的排序。        保证元素唯一性的方式:通过比较的结果是否为0.        底层数据结构是:二叉树。*/   import java.util.*; class TreeSetDemo2 { public static void main(String[] args) { ...

nizhengjia的专栏 359

TreeSet

前言:直面自己,敢于正视自己的缺点,并努力完善自己;直面困境,逆境是淘汰竞争者的机会, 别把自己淘汰了;不要觉得自己现在啥也不是,只要努力三年后无论是能力还是回报都会有较大的提升 TreeSet 它是SortedSet接口的实现类,它是一个有序而且唯一的单值类型集合~ TreeSet01:--------- public class Test01 { public static vo

Jacky_Cmd 1760

TreeSet()详解

1.TreeSet原理:   /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 *  * Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序) *  * 如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口 *   在类上implement Comparable *   重...

weixin_33756418的博客 280

TreeSet简单介绍与使用方法

  TreeSet简介   TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>,Cloneable,java.io.Serializable接口。   一种基于TreeMap的NavigableSet实现。   因为TreeSet继承了Abstrac...

weixin_30364147的博客 694

Java中TreeSet的用法

Java中 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构。和普通的HashMap不一样,普通的HashMap元素存取的时间复杂度一般是O(1)的范围,而TreeMap内部对元素的操作复杂度为O(logn)。 虽然在元素的存取方面TreeMap并不占优,但是它内部的元素都是排序的,当需要查找某些元素以及顺序输出元素的时候它能够带来比较理想的结果。可以说,TreeMap是

行者小朱的博客 4万+

TreeSet的两种排序方式

1.排序的引入 由于TreeSet可以实现对元素按照某种规则进行排序,例如下面的例子public class TreeSetDemo { public static void main(String[] args) { // 创建集合对象 // 自然顺序进行排序 TreeSet ts = new TreeSet(); // 创建元素并添加 // 20,18,23,22,1

xiaofei的博客 4万+

黑马程序员_日记8_JavaSE阶段性习题练习及复习

——- android培训、java培训、期待与您交流! ———-JAVASE阶段性习题练习及复习这篇博客主要是把毕老师出的前四大练习题全部做了一遍,经我反复测试和修改后写得一些JAVASE基础总结。 练习一 已知学生成绩以100分为满分,共分5个等级:A,B,C,D,E。 90~100为等级A,80~89为等级B,70~79为等级C, 60~69为等级D,0~59为等级E。

itheima_1llt的专栏 3599

黑马程序员_日记27_JavaString类型的数字排序问题

——- android培训、java培训、期待与您交流! ———-输入一int型的数字字符串 用空格间隔,从小到大排序后,以字符串返回。 “12 0 99 -7 30 4 100 13” 要求对字符串中的数值进行排序。生成一个数值从小到大新字符串。“-7 0 4 12 13 30 99 100”分析: 1 用split方法把字符串切割成String[]类型的数组。 2 把String[]数组

itheima_1llt的专栏 2677
上一篇: 黑马程序员_日记42_HashSet自定义对象去重练习
下一篇: 黑马程序员_日记44_TreeSet第一种排序方式小结
回到未来2020
博客等级 码龄12年 27粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值