Java进阶07集合(续)

Java进阶07 集合(续)

一、数据结构(树)

1、关于树

1.1 相关概念
  • 节点:树中每个单独的分支

  • 节点的度:每个节点的子节点数量

  • 树高:树的总层数

  • 根节点:最顶层节点

  • 左子节点:左下方的节点

  • 右子节点:右下方的节点

  • 左子树:节点左下方连接的全部节点

  • 右子树:节点右下方连接的全部节点

1.2 二叉树&二叉查找树

  • 普通二叉树

    树中任意节点的度都<=2

  • 二叉查找树

    又称二叉排序树、二叉搜索树。其特点是:①首先必须是二叉树;②任意节点左子树上的值均小于当前节点值;③任意节点右子树上的值都大于当前节点值;

    二叉查找树的节点如果都挂在同一边,会产生瘸腿现象,那么它的查询效率就和普通的单链表一样了,为了解决这个问题,引入平衡二叉树

1.3 平衡二叉树

在是二叉查找树的前提下,任意节点的左右子树高度差不超过1,即为平衡二叉树。由于平衡二叉树的这个特点,每次往该树中加入新的节点时,就可能会对其平衡性有影响。当添加了某个节点后,改变了该树的平衡性,则会触发旋转机制来保证平衡性

  • 旋转规则

    确定支点:从添加的结点开始,不断往父节点找不平衡的节点,这个点就是支点

    • 左旋(右右加入造成不平衡)

      case1.支点没有左子节点

      把支点左旋降级,变成左子节点;晋升原来的右子节点

      case2.支点有左子节点

      将根节点的右侧往左拉;原先的右子节点变成新的父节点,并把多余的左子节点让出,给已经降级的根节点当右子节点

    • 右旋(左左加入造成不平衡)

      case1.支点没有右子节点

      把支点右旋降级,变成右子节点;晋升原来的左子节点

      case2.支点有右子节点

      将根节点的左侧往右拉;原先的左子节点变成新的父节点,并把多余的右子节点让出,给已经降级的根节点当左子节点

  • 需要旋转的四种情况

    左左意思为根节点的左子树的左子树加入导致的不平衡,其余三种情况类似

    • 左左:一次右旋

    • 左右:先局部左旋,再整体右旋

    • 右右:一次左旋

    • 右左:先局部右旋,再整体左旋

2、红黑树

2.1 红黑树的概念

红黑树是一种自平衡的二叉查找树,是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,节点颜色非黑即红。红黑树不是高度平衡的,它的平衡是通过”红黑规则“实现的。

2.2 红黑规则

①每一个节点是红色或黑色

根节点必须是黑色

③如果一个节点没有子节点或父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的

④如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个相邻的红节点

⑤对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

助记口诀:左根右、根叶黑、不红红、黑路同
  • 左根右:左子树节点值<=根节点值<=右子树节点值

  • 根叶黑:根节点和叶节点(外部节点Nil)均是黑色的

  • 不红红:不能出现两个相邻的红节点

  • 黑路同:从某个节点出发,一条路走到黑(即走到它的后代叶节点上)经过的黑色节点数都相同

2.3 添加节点规则

3、动画演示网站

Data Structure Visualization (usfca.edu)

二、TreeSet集合

1、作用

对集合中的元素进行排序操作(底层红黑树实现);且属于Set派系,不允许存储重复数据,可以去重

1.1 综合案例

需求:键盘录入一个字符串,对字符串中的字符去重,并排序

public class TreeSetTest1 {public static void main(String[] args) {System.out.println("请输入:");String content = new Scanner(System.in).nextLine();
​//1、将字符串拆分为字符数组,方便获取每一个字符char[] chars = content.toCharArray();//2、准备TreeSet集合用于排序和去重TreeSet<Character> set = new TreeSet<>();
​//3、遍历字符数组,并将每一个字符添加到集合for (char c : chars) {set.add(c);}
​//4、多次拼接且不知道拼接次数,创建StringBuilder拼接StringBuilder sb = new StringBuilder();//注意:Set集合遍历方式只有三种(迭代器、增强for、foreach方法)set.forEach(c->sb.append(c));
​//展示拼接后的内容System.out.println(sb);}
}

2、排序方式

2.1 默认排序方式
  • Integer类,默认按数值大小排序

  • String类,默认按照其对应的编码表中的整数值逐个比较,均相同的会按照长度比较,短的在前

    TreeSet<String> set1 = new TreeSet<>();set1.add("aaa");set1.add("aaaa");set1.add("aab");set1.add("cde");
    ​System.out.println(set1);
    ​
    //排序结果为:aaa aaaa aab cde
2.2 自然排序
  • 类实现Comparable接口

  • 重写CompareTo方法

  • 根据方法的返回值,来组织排序规则(返回负数往左,返回正数往右,返回0不存)

    public class TreeSetDemo2 {public static void main(String[] args) {TreeSet<Student> set = new TreeSet<>();
    ​set.add(new Student("张三",23));set.add(new Student("李四",24));set.add(new Student("王五",25));
    ​System.out.println(set);}
    }
    ​
    //Student类要实现Comparable接口,重写compareTo方法的内部逻辑,此处年龄为主要排序依据,姓名为次要排序依据
    @Override  //年龄正序
    public int compareTo(Student o) {int ageResult = this.age-o.age;   //按年龄正序排列   倒序为o.age-this.ageint nameResult = ageResult == 0 ? this.name.compareTo(o.name) : ageResult;//同名同年龄的需要保留,返回1或-1都无所谓,因为内容一样,谁前谁后不重要return nameResult == 0 ? 1 : nameResult;
    }
2.3 比较器排序(覆盖自然排序)
  • 在TreeSet的构造方法中,传入Compartor接口的实现类对象

  • 重写compare方法

  • 根据方法的返回值,来组织排序规则(返回负数往左,返回正数往右,返回0不存)

    public class TreeSetDemo3 {/*需求:对字符串进行排序,根据字符串的长度,从大到小排序*/public static void main(String[] args) {//String类为Java写好的类,已具备自然排序,但不是我想要的排序规则,需要比较器排序TreeSet<String> set = new TreeSet<>(new Comparator<String>() {//重写compare方法@Overridepublic int compare(String o1, String o2) {//按长度倒序排列    o1.xxx-o2.xxx  正序  int lengthResult = o2.length()-o1.length();return lengthResult==0?o2.compareTo(o1):lengthResult;}});
    ​set.add("aaa");set.add("aa");set.add("bbbb");set.add("bb");set.add("aaaa");
    ​System.out.println(set);}
    }

3、排序如何选择

Java已经写好的类(如String、Integer、Double...)大多数都具有自然排序的规则(String默认按字典顺序、Integer默认升序、Double默认升序),这些规则放在源码中,我们无法修改其比较规则,如果我们要实现的排序规则跟自然排序不一样,此时需要使用比较器排序来覆盖自然排序规则。因为当同时具备自然排序和比较器排序时,会优先按照比较器进行排序操作;

4、利用TreeSet集合降序排列ArrayList

方法说明
static <T> void sort(T[] a,Comprtor<? super T> c)根据指定比较器产生的顺序指定对象数组进行排序
public class ArraysDemo {public static void main(String[] args){//利用集合TreeSet集合方法对数组降序排列Integer[] arr3 ={11,55,33,22,44};Arrays.sort(arr3, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;     //o2-o1降序}});System.out.println(Arrays.toString(arr3));}
}

三、HashSet集合

1、关于HashSet底层

集合底层采取哈希表存储数据,JDK8之前的哈希表是数组+链表;JDK8之后的哈希表是数组+链表+红黑树。哈希表是一种对于增删改查数据性能都比较好的结构

2、配合去重

HashSet特点就是去重。为了保证元素唯一,必须同时重写HashCode和equals方法!!!

2.1 配合去重流程

往集合中添加对象→→→调用对象的HashCode方法**,计算出一个应存入的索引地址→→→查看该位置上是否已存在元素→→→不存在则直接存;存在,调用equals方法比较内容→→→内容不同,存入集合;内容相同,不存入。

2.2 HashCode方法
  • 该方法底层调用了C++代码计算出一个随机数(常被人称为地址值)

  • 是JDK根据某种规则算出来的int类型的整数

  • 我们不必太过关注其内部实现,可以把它简单的理解为会计算出某个对象对应的整数值

  • 为了避免存入的时候元素都堆积在同一个索引位置,因此hashcode方法的重写就显得格外重要

    ⭐重写改造原则(降低索引冲突)⭐

    将对象的所有属性值都带入运算

    • 对象的属性相同,返回哈希值一定相同

    • 对象的属性不同,返回哈希值尽量不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8615.shtml

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

相关文章

Python专题:三、数字和运算(2)

目录 一、数学运算 二、赋值运算 一、数学运算 1、运算符号 加法 减法- 乘法* 除法/ 计算机中浮点数表示有精度限制&#xff0c;Python有限&#xff0c;所以近似取数 2、除法取整// Python2中 整数/整数 值为整数 Python3中 整数/整数 整数or浮点数 //计算除法对结果取…

2024年最适合做的母婴赛道,选品思路揭秘,教你如何选品!

大家好&#xff0c;我是电商花花。 在我印象中&#xff0c;每年都有人唱衰抖音小店不好做了&#xff0c;太卷了&#xff0c;普通人没有机会了&#xff0c;但是现在直播电商时代&#xff0c;很多信息都会片面的&#xff0c;做不好并不是因为不好做&#xff0c;而是因为你做不好…

60*13薪,外包到新疆...去吗?

大家好&#xff0c;我是白露呀。 今天我在牛客上看到一篇帖子&#xff0c;一位网友说自己收到一个 offer &#xff0c;薪资很高&#xff1a;60k*13&#xff0c;大约一年有近80万。 但是有个要求是外包到新疆的乌鲁木齐&#xff0c;他拿不定主意&#xff0c;就在牛客上发了这个…

Crocoddyl 使用教程(二)

系列文章目录 前言 小车摆杆是另一个经典的控制实例。在这个系统中&#xff0c;一根欠驱动的杆子被固定在一辆一维驱动的小车顶部。游戏的目的是将杆子升到站立位置。 模型如下&#xff1a; https://en.wikipedia.org/wiki/Inverted_pendulum 我们用 表示小车质量、 表示摆杆质…

Agent Hospital: 一种可进化医疗代理人的医院模拟器

论文来源: https://arxiv.org/pdf/2405.02957 1 引言 大型语言模型(LLM)代理在各种任务中表现出了有前景的性能,包括代码生成、信息博弈和问答等。受 LLM 代理能力的启发,一些研究采用它们来模拟人类互动和行为,而不是处理单一任务,例如社交媒体上的信息传播和"Stanford…

Pyside6详细使用教程python之GUI开发

1、首先需要安装Pyside6&#xff0c;终端执行命令&#xff1a; pip3.10 install pyside6 2、你们的一般是 pip install pyside6 2、如下代码创建一个简易程序导入必要的模块 import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton,…

c语言实现贪吃蛇小游戏————附全代码!!!

目录 1.Win32 API 1.1控制台应用程序 1.2控制台的名称&#xff0c;控制台窗口大小 1.3设置控制台光标位置 COORD - 光标坐标 GetStdHandle - 获取句柄 SetConsoleCursorPosition - 设置光标位置 封装一个设置光标的函数 1.4设置控制台光标的属性 CONSOLE_CURSOR_INFO …

HNU-人工智能-作业1

人工智能-作业1 计科210x 甘晴void 第1题 考虑一个实时的在线电话翻译系统&#xff0c;该系统实现英语与日语之间的实时在线翻译&#xff0c;讨论该系统的性能度量&#xff0c;环境&#xff0c;执行器&#xff0c;感知器&#xff0c;并对该环境的属性进行分析。&#xff08;10…

【Android】源码解析Activity的结构分析

源码解析Activity的结构分析 目录 1、Activity、View、Window有什么关联&#xff1f;2、Activity的结构构建流程3 源码解析Activity的构成 3.1 Activity的Attach方法3.2 Activity的OnCreate 4、WindowManager与View的关系总结 1、一个Activity对应几个WindowManage&#xff0…

Java 中的 HTTP 客户端库OkHttp、Apache HttpClient和HttpUrlConnection

大家好&#xff0c;我是G探险者。 项目开发里面经常会有这么一种场景&#xff1a;与服务器进行 HTTP 通信。一般存在于服务间远程调用的场景 Java 生态系统提供了多种 HTTP 客户端库&#xff0c;每种都有其自己的特点、优势和适用场景。 本文将介绍几种主要的 Java HTTP 客户…

基于Springboot的校园招聘系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园招聘系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

modprobe: can‘t open ‘modules.dep‘: No such file or directory

使用modprobe会提示modprobe: cant open modules.dep: No such file or directory 直接输入depmod即可。 如果depmod没有效果&#xff0c;则需要重新配置编译你的根文件。 在busybox配置界面进入linux Module Utilities, 上下键选择depmod&#xff0c;并按 y 选中&#xff0c…

期权和期货有什么区别?

今天期权懂带你了解期权和期货有什么区别&#xff1f;期权和期货是两种常见的衍生金融工具&#xff0c;它们在结构和盈利方式上存在一些关键的区别&#xff1a; 期权 期权是一种给予持有者在未来某个时间以特定价格买入或卖出基础资产的权利&#xff0c;但不是义务。期权的主要…

LeetCode 110. 平衡二叉树

LeetCode 110. 平衡二叉树 1、题目 题目链接&#xff1a;110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2…

Android 14 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 34。 影响Android 14上所有应用 1.最低可安装的目标 API 级别 从 Android 14 开始&#xff0c;targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安…

(二刷)代码随想录第1天|704. 二分查找 27. 移除元素

704. 二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili 给定一个 n 个元素有序的&#xff08;升序&#xff09…

国科大深度学习期末历年试卷

本文借鉴 国科大深度学习复习 深度学习期末 深度学习2020 一&#xff0e;名词解释&#xff08;每个2分&#xff0c;共10分&#xff09; 深度学习&#xff0c;稀疏自编码器&#xff0c;正则化&#xff0c;集成学习&#xff0c;Dropout 二&#xff0e;简答题&#xff08;每题…

设置默认表空间和重命名

目录 设置默认表空间 创建的临时表空间 tspace4 修改为默认临时表空间 创建的永久性表空间 tspace3 修改为默认永久表空间 重命名表空间 将表空间 tspace3 修改为 tspace3_1 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/13520…

万字长文详解Typora+PicGo+Github/Gitee的配置教程

文章目录 1.前言1.1 Typora简介1.2 引入1.2.1 移动本地图片位置导致图片加载失败问题解决方案反思&#xff1a; 1.2.2 CSDN导入图片转存失败1.2.3 思考 1.3 图床工具1.4 使用原因1.5 总结 2.安装教程2.1 Typora安装教程2.1.1 下载安装包方式1&#xff1a;百度网盘方式2&#xf…

FPGA ov5640视频以太网传输

1 实验任务 使用DFZU4EV MPSoC 开发板及双目OV5640摄像头其中一个摄像头实现图像采集&#xff0c;并通过开发板上的以太网接口发送给上位机实时显示。 2 Verilog代码 2.1 顶层模块 timescale 1ns / 1ps //以太网传输视频顶层模块module ov5640_udp_pc (input sys_cl…