数据结构:Map Set(一)
目录
一、搜索树
1、概念
2、查找
3、插入
4、删除
二、搜索
1、概念及场景
2、模型
(1)纯key模型
(2)Key-Value模型
三、Map的使用
1、什么是Map?
2、Map的常用方法
(1)V put(K key, V value)
(2)V get(Object key)
(3)V getOrDefault(Object key, V defaultValue)
(4)V remove(Object key)
(5)Set keySet()
(6)Collection values()
(7)Set> entrySet()
(8)boolean containsKey(Object key)
(9)boolean containsValue(Object value)
四、Set的使用
1、什么是Set?
2、Set的常用方法
(1)boolean add(E e)
(2)void clear()
(3)boolean contains(Object o)
(4)Iterator iterator()
(5)boolean remove(Object o)
(6)int size()
(7)boolean isEmpty()
(8)Object[] toArray()
(9)boolean containsAll(Collection c)
(10)boolean addAll(Collection c)
在前面我们已经学完了数据结构中常见的排序算法,而今天我们就要开始学习数据结构上新的里程碑——Map & Set。
一、搜索树
1、概念
二叉搜索树又称二叉排序树,它或者是一棵空树,并且这棵树具有以下这些性质:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
如下这棵树就是一棵二叉搜索树:
既然作为一棵树那么它也一定具有查找,插入和删除的功能,那么接下来就让我们来依次实现这些操作吧
由于是要我们自己来实现,那我们肯定要先做一下准备工作,我们要创建创建搜索树的结点和根结点
public class BinarySearchTree {static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}}//当前搜索树的根节点public TreeNode root = null;
}
2、查找
这个操作就很简单了,我们只需要遍历这棵二叉搜索树判断是否有结点的val值与我们给的val值相等即可。
当然上述是对于一棵普通的二叉树的查找方式,而我们的二叉搜索树又称二叉排序树,那么它一定是有一定顺序的,所以查找方式也是有一定不同的根据上述的性质我们直到左子树的值都小于根节点的值,右子树的值多大于根节点的值,并且每棵子树也都是二叉搜索树。
1、我们可以先定义一个cur存储root,进行遍历
2、如果我们 cur的值小于我们要查找的值,就上我们的右子树上去找
cur.val < val 执行 cur = cur.right
3、如果我们 cur的值大于我们要查找的值,就上我们的左子树上去找
cur.val > val 执行 cur = cur.left
4、如果我们 cur的值等于于我们要查找的值,就返回cur
cur.val == val 执行 return cur
5、如果树为空或者没有要查找的值,就返回null
public TreeNode search(int val) {TreeNode cur = root;while (cur != null) {if(cur.val < val) {cur = cur.right;}else if(cur.val > val) {cur = cur.left;}else {return cur;}}return null;}
最优情况下,二叉搜索树为完全二叉树,其平均比较次数为: O(logN)
最差情况下,二叉搜索树退化为单支树,其平均比较次数为: N
3、插入
1、我们要先判断是否为空树,如果为空树,那么我们此时要插入的结点就是我们的根结点
2、不为空树,我们就创建两个结点,prev和cur,cur用来遍历二叉搜索树,prev用来存储cur遍历到结点的根结点。
3、我们要先进行插入数据大小的判断如果大于cur.val,先让prev指向cur,然后让cur往右走,小于先让prev指向cur,然后让cur往左走。
4、如果我们在遍历的过程中发现我们要插入的值在二叉搜索树中存在,就直接返回不用插入。
5、如果cur指向null了,我们就代表可以进行插入了,跳出循环
6、跳出循环后,此时prev就是我们cur的父结点,我们要进行判断是在prev左边还右边进行插入
如果prev的值小于val,在prev的右边进行插入
prev.val < val 执行 prev.right =newTreeNode
如果prev的值大于val,在prev的左边进行插入
prev.val > val 执行 prev.left = newTreeNode
public void insert(int val) {TreeNode newTreeNode =new TreeNode(val);if(root == null){root = newTreeNode;return;}TreeNode cur = root;TreeNode prev = null;while(cur != null){if(cur.val > val){prev = cur;cur = cur.right;}else if(cur.val < val){prev = cur;cur = cur.left;}else{return;}}if(prev.val < val){prev.right =newTreeNode;}if(prev.val > val){prev.left = newTreeNode;}}
4、删除
对于删除的操作,我们还是要先找到要删除的结点,我们还是利用cur和prev两个结点,cur用来查找要删除的结点,prev用来记录,我们遍历过程中cur的父节点,而当我们找到这个要删除的结点后,我们还要面临几种情况:
1、cur.left == null
2、cur.right==null
3、cur.left!=null&&cur.right!=null
我们先创建两个结点 target 存储cur.right 和 targetParent 存储 cur,如果我们想要进行删除,我们必须要确保我们删除后,此时结点之后的左右子树依然能够是二叉搜索树,所以我们要确定我们新的值要比左边大,又要比右边小,而这时我们有两种删除方法:
方法一:在左子树中找到左子树中的最大值(即左树的最右边的结点)
(因为左子树的最大值一定大于所有左子树的结点,并且因为最大值属于左树,左树的值是一定小于右树的,因此此时的最大值也一定是小于右树的),然后让他的值更新cur结点,最后我们只要删除这个结点即可
方法二:在右子树中找到右子树中的最小值(即右数的最左边的结点)
(因为右子树的最小值一定小于所有右子树的结点,并且因为最小值属于右树,右树的值是一定大于左树的,因此此时的最小值也一定是大于左树的),然后让他的值更新cur结点,最后我们只要删除这个结点即可
public void remove(int val){TreeNode cur = root;TreeNode prev = null;while (cur != null) {if(cur.val < val) {prev = cur;cur = cur.right;}else if(cur.val > val) {prev = cur;cur = cur.left;}else {removeNode(cur,prev);return ;}}}public void removeNode(TreeNode cur ,TreeNode prev){if(cur.left == null){if(cur == root ){root = root.right;}else if(cur == prev.left){prev.left = cur.right;}else if(cur == prev.right){prev.right = cur.right;}}else if(cur.right == null){if(cur == root ){root = root.left;}else if(cur == prev.left){prev.left = cur.left;}else if(cur == prev.right){prev.right = cur.left;}}else{TreeNode target = cur.right;TreeNode targetParent = cur;while(target.left != null){targetParent = target;target = target.left;}cur.val = target.val;if(targetParent.left == target){targetParent.left = target.right;}else{targetParent.right = target.right;}}}
二、搜索
1、概念及场景
Map和set是⼀种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。 以前常见的搜索方式有:
1、直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢
2、二分查找,时间复杂度为,但搜索前必须要求序列是有序的
上述查找方式比较适合进行静态查找的方式,我们在这种方式下一般不会进行插入和删除的操作,
因此这就要引出我们的动态查找方式,而这章要讲的Map和Set就是一种适合动态查找的集合容器。
2、模型
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键 值对,所以模型会有两种:
(1)纯key模型
比如我们有一句英文:Failure is the fog through which we glimpse triumph.(透过失败的迷雾,才能瞥见胜利的光辉。)
而我们的纯key模型,就是查找我们的单词 fog 是否出现在这句英文中。
(2)Key-Value模型
而我们的Key-Value模型,就是统计这句英文中每个单词出现的次数,统计结果是每个单词都有与其对应的次数: <单词,单词出现的次数>
而接下来我们要介绍的Map中存储的就是key-value的键值对,Set中只存储了Key。
三、Map的使用
1、什么是Map?
Map是一个接口类,该类没有继承自Collection,该类中存储的是结构的键值对,并且K一定是唯一的,不能重复。
2、Map的常用方法
由于Map是是一个接口,不能自己进行实例化,我们需要使用TreeMap(红黑树)和HashMap(哈希桶)进行实例化。
(1)V put(K key, V value)
解释:设置 key 对应的 value
我们发现Map还会根据我们的key值自动排序
(2)V get(Object key)
解释:返回 key 对应的 value
(3)V getOrDefault(Object key, V defaultValue)
解释:返回 key 对应的 value,key不存在,返回默认值
(4)V remove(Object key)
解释:删除 key 对应的映射关系
(5)Set<K> keySet()
解释:返回所有 key 的不重复集合
(6)Collection<V> values()
解释:返回所有 value 的可重复集合
(7)Set<Map.Entry<K,V>> entrySet()
解释:返回所有的 key-value 映射关系
在对他进行讲解前我们要先对Map.Entry<K,V>进行说明
Map.Entry是Map内部实现的用来存放键值对映射关系的内部类,该内部类中主要提供了的获取,value的设置以及Key的比较方式
方法 解释 K getKey() 返回 entry 中的 key V getValue() 返回 entry 中的 value V setValue(V value) 将键值对中的value替换为指定value
(8)boolean containsKey(Object key)
解释:判断是否包含 key
(9)boolean containsValue(Object value)
解释:判断是否包含 value
注意事项:
1、Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者 HashMap
2、Map中存放键值对的Key是唯一的,value是可以重复的
3、在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但是HashMap的key和value都可以为空。
4、Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
5、Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
6、Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然 后再来进行重新插入。
四、Set的使用
1、什么是Set?
Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
2、Set的常用方法
(1)boolean add(E e)
解释:添加元素,但重复元素不会被添加成功
(2)void clear()
解释:清空集合
(3)boolean contains(Object o)
解释:判断o是否在集合中
(4)Iterator<E> iterator()
解释:返回迭代器,通过迭代器进行打印
(5)boolean remove(Object o)
解释:删除集合中的 o
(6)int size()
解释:返回set中元素的个数
(7)boolean isEmpty()
解释:检测set是否为空,空返回true,否则返回false
(8)Object[] toArray()
解释:将set中的元素转换为数组返回
(9)boolean containsAll(Collection<?> c)
解释:集合c中的元素是否在set中全部存在,是返回true,否则返回false
(10)boolean addAll(Collection<?extends E> c)
解释:将集合c中的元素添加到set中,可以达到去重的效果
注意事项:
1、Set是继承自Collection的一个接口类
2、Set中只存储了key,并且要求key一定要唯一
3、TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
4、Set最大的功能就是对集合中的元素进行去重
5、实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在 HashSet的基础上维护了一个双向链表来记录元素的插入次序。
6、Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
7、TreeSet中不能插入null的key,HashSet可以。
好了,今天的分享就到这里了还请大家多多关注,我们下一篇见!
相关文章:
数据结构:Map Set(一)
目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 (1)纯key模型 (2)Key-Value模型 三、Map的使用 1、什么是Map? 2、Map的常用方法 (1)V put(K …...
Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单
Ansible 自动化 Linux 运维:解放你的双手,让运维变得简单 在现代 IT 运维中,随着系统规模的不断扩展,如何高效地管理和维护大量的服务器成为了一项巨大挑战。传统的手动操作不仅费时费力,还容易出错。而 Ansible 作为一款开源的自动化运维工具,凭借其易用性和强大的功能…...
不需要移植和配置xinetd 等相类似执行文件,tftp-hpa服务器交叉移植使用说明
tftp-hpa-5.2.tar.gz :下载链接 https://download.csdn.net/download/lyeffort/90361414 tar -xvf tftp-hpa-5.2.tar.gz -C /root/tftpd/ # ./autogen.sh # export PATH/root/linux-arm-tools/mips-linux-gclibc/bin:$PATH # mkdir /root/tftpd/install # ./configure --h…...
利用用个人PC搭建私有大模型(低成本、易实施的私有大模型部署方案,兼顾英语 5G协议学习与实践需求)
背景 个人有2台电脑, 第一台: laptop cpu 12th Gen Intel Core™ i7-1260P 2.10 GHz, GPU intel iris Xe graphics, 第二台: MS-7D22,Intel Core™ i5-10400F CPU 2.90GHz, GeForce GT 730。想…...
SAP 借助 Databricks 推出Business Data Cloud
SAP与Databricks合作推出了SAP Business Data Cloud,这是一项突破性的解决方案,旨在统一和整合企业内所有SAP及第三方数据,为企业提供可信的数据基础,从而推动更具影响力的决策并促进可靠的AI应用。这一合作标志着企业数据管理的新…...
地基Spring中bean生命周期和设计模式
面试问题: 在Java面试中,当被提问到Spring中Bean的生命周期和设计模式时,你可以按照以下方式回答,以体现自己的专业知识和实际项目经验: Spring中Bean的生命周期 Spring中Bean的生命周期是一个复杂但有序的过程&#…...
CanMV的刷新比Openmv强
今天使用CanMV k230的板子,发现CanMV的刷新比Openmv强,速度快,不用再次拍照刷新,写一次就能在ide屏幕上同时显示。 参考一下CanMV K230拍照保存Demo - CanMV(K210 / K230) - 01科技 | 01Studio Takephot(…...
Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?
Xilinx kintex-7系列资源如下图 Xilinx各系列的GT资源类型和性能 PCIe Gen1/2/3的传输速率对比 K7上面使用的高速收发器GTX最高速率为12.5GT/s, PCIe Gen2 每个通道的传输速率为 5 GT/s。 PCIe Gen3 每个通道的传输速率为 8 GT/s。 所以理论上硬件支持PCIe3.0&#…...
蓝桥杯篇---实时时钟 DS1302
文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…...
【蓝桥杯嵌入式】8_IIC通信-eeprom读写
全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 这个电路允许通过I2C总线与EEPROM(M24C02-WMN6TP)和数字电位器(MCP4017T-104ELT)进行通信。EEPROM用于存储数据,而数字电位器可以用…...
支持向量机原理
支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…...
E8移动建模关联建模表单,写入无数据
场景:移动建模新建一个招聘页面,每次通过移动建模写入建模表数据,建模表的值都要权限重构才可看见,且明细无数据。 排查原因:移动建模提交后返回的ID值为空 正常情况下提交数据应该要返回一个ID值如下: 解…...
一文深入了解DeepSeek-R1:模型架构
本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型,以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 📝 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...
腿足机器人之二- 运动控制概览
腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…...
前端面试大全
前端面试大全 一、htmlcss1、垂直定位的实现方式 二、javascript1、深拷贝浅拷贝2、作用域3、原型原型链4、防抖节流5、设计模式 三、ES61、 四、typescript五、vue1、vue2和vue3的区别2、生命周期3、computedwatch 六、react七、uni-app八、Cesiumopenlayer九、Threejs十、ngi…...
如何使用智能化RFID管控系统,对涉密物品进行安全有效的管理?
载体主要包括纸质文件、笔记本电脑、优盘、光盘、移动硬盘、打印机、复印机、录音设备等,载体(特别是涉密载体)是各保密、机要单位保证涉密信息安全、防止涉密信息泄露的重要信息载体。载体管控系统主要采用RFID射频识别及物联网技术…...
Python 调用 DeepSeek API 案例详细教程
本案例为以 Python 为例的调用 DeepSeek API 的小白入门级详细教程 步骤 先注册并登录 DeepSeek 官网:https://www.deepseek.com/ 手机号验证码注册或登录即可 创建 API KEY 注意保存,写代码时必须提供的 打开 Pycharm 创建工程 并安装 OpenAI 库编写代…...
牛客面筋学习
准备阶段: 楼主其实很早就开始准备了,大概从年初开始,陆陆续续总结自己的项目,复盘,然后复习数电模电信号电路等,复习完后,便开始刷题;顺便说一下,如果需要发小论文的也…...
对指针的深入运用-通讯录的初步实现
1.通讯录的功能 手机里的通讯录,是能够存放联系人的信息,包括姓名,性别,地址,电话号码,也可以加上性别。而且手机中的通讯录肯定有增删查改的功能,而且在list里是按照顺序排序的,可以…...
VUE环境搭建
node.js安装 node npm – node Package Management 安装完成后,需要设置: npm config set prefix "D:\nodejs"注意:“D:\nodejs” 此处为自己安装的node.js路径。管理员身份运行 切换镜像源 npm config set registry https://r…...
DeepSeek应用——与PyCharm的配套使用
目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…...
C# ASP.NET的未来发展趋势
.NET学习资料 .NET学习资料 .NET学习资料 在快速发展的技术浪潮中,C# ASP.NET不断顺应时代潮流,展现出一系列令人瞩目的未来发展趋势。这些趋势不仅反映了技术的进步,也为开发者带来了更多的机遇和挑战。 云原生应用开发 随着云计算的普及…...
leetcode 416. 分割等和子集
题目如下 数据范围 本题和leetcode 2915. 和为目标值的最长子序列的长度类似,这里不过多赘述。leetcode 2915. 和为目标值的最长子序列的长度 通过代码 class Solution { public:bool canPartition(vector<int>& nums) {int n nums.size();int an…...
WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景
WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据(Metadata…...
浅聊MQ之Kafka与RabbitMQ简用
Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动: 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后,通过命令行启动Zookeeper(Kafka的运行依赖于Zookeeper)。启动Kafka的服务器进程。 基本功能实现: 生…...
2.1 JUnit 5 测试发现机制详解
JUnit 5 测试发现机制详解 JUnit 5 的测试发现机制是框架的核心功能之一,负责识别测试类、方法和其他可执行元素,并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性,允许开发者自定义测试发现规则。以下是其工作原理的详细解析…...
【Elasticsearch】match查询
Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...
【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案
概述 由于最近客户需要解决redis版本升级问题,故而全网寻找安全版本,redis7.4.x版本求而为果,只能自己编译了。 截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2 Security fixes (CVE-2024-46981) Lua script commands may lead t…...
云计算——AWS Solutions Architect – Associate(saa)6.CloudWatch
Amazon CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师(SRE)和 IT 经理的监控和可观测性服务。CloudWatch 为我们提供相关数据和切实见解,以监控应用程序、响应系统范围的性能变化、优化资源利用率,并在统一视图中查看运营状况。 Clo…...
面试实战题:手写一个队列和介绍Stream流怎么使用
手写一个队列 思路解析: 队列要有入队和出队操作,还要有查看队列大小,查看队头元素,查看队列是否为空,查看队列是否满了这些功能 package com.example.transational.MyQueue;public class MyQueue<T> {privat…...
Jmeter+Influxdb+Grafana平台监控性能测试过程
一、Jmeter自带插件监控 下载地址:https://jmeter-plugins.org/install/Install/ 安装:下载后文件为jmeter-plugins-manager-1.3.jar,将其放入jmeter安装目录下的lib/ext目录,然后重启jmeter,即可。 启动Jmeter&…...
【现代深度学习技术】深度学习计算 | GPU
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性
1、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...
Node.js调用DeepSeek Api 实现本地智能聊天的简单应用
在人工智能快速发展的今天,如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用,它通过调用硅基流动(SiliconFlow)的API接口,实现了与DeepSeek模型的智能对话…...
实战 - 编写一个最简单的 Hello World 内核模块
实战 - 编写一个最简单的 Hello World 内核模块 在嵌入式开发中,编写 Linux 内核模块是设备驱动开发的重要基础。内核模块可以帮助我们在不修改内核源码的情况下扩展内核功能。本篇博客将指导你如何编写并运行一个简单的 Hello World 内核模块,让你快速…...
面向对象程序设计-实验七
6-1 计算捐款总量 这里需要设计一个捐款人类Donator及一个相关函数getMaxName( ),Donator类中包含捐款人的姓名及其捐款额 代码清单: #include <iostream> using namespace std; class Donator { private: string name; float money; //单位&…...
JVM组成
JVM是什么? JVM(Java Virtual Machine):Java程序的运行环境(java二进制字节码的运行环境) 好处: 1.一次编写,到处运行 Java代码是如何做到一次编写,到处运行? 计算机的最底层是计…...
java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException
Java8升级到17之后, 启动报错, :LocalValidatorFactoryBean]: Factory method defaultValidator threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException 报错原因:这个错误通常是由于缺少 javax.xml.bind 相关的依赖引起…...
Electron 实现自定义系统托盘菜单
效果如下: 其实实现自定义托盘菜单的本质上,就是开一个新窗口,下面直接给出核心代码。 // 加载窗口 const loadWindow (example, path) > {if (is.dev && process.env[ELECTRON_RENDERER_URL]) {example.loadURL(process.env[EL…...
HCIA-路由器相关知识和面试问题
二、 路由器 2.1 关于路由器的知识 2.1.1 什么是路由器 路由器是一种网络层互联设备,主要用于连接多个逻辑上分开的网络,实现不同网络之间的数据路由和通信。它能根据网络层地址(如 IP 地址)来转发数据包,在网络中起…...
2.【BUUCTF】bestphp‘s revenge
进入题目页面如下 进行代码审计 <?php // 1. 高亮显示当前PHP文件的源代码,方便开发者查看代码内容,在生产环境中不应使用此函数,可能会导致代码泄露。 highlight_file(__FILE__);// 2. 定义变量 $b ,其值为字符串 implode &…...
wx060基于springboot+vue+uniapp的宿舍报修系统小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
使用 meshgrid函数绘制网格点坐标的原理与代码实现
使用 meshgrid 绘制网格点坐标的原理与代码实现 在 MATLAB 中,meshgrid 是一个常用函数,用于生成二维平面网格点的坐标矩阵。本文将详细介绍如何利用 meshgrid 函数生成的矩阵绘制网格点的坐标,并给出具体的代码实现和原理解析。 实现思路 …...
快速上手Vim的使用
Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式(ctrlV进入) Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑,甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…...
HCIA项目实践---ACL访问控制列表相关知识和配置过程
十 ACL访问控制列表 1 策略的概念 在网络连通之后, 把所有为了追求控制而实现的技术都叫策略 2 访问控制 在路由器流量流入或者流出的接口上,匹配流量,执行相应的动作。(流量流入或者流出的接口并不是一个固定的概念而是一个相对的…...
机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...
Oracle 12c 并发统计信息收集功能:技术解析与实践指南
一、功能背景与核心价值 在Oracle数据库的早期版本中,统计信息收集(如通过DBMS_STATS包)是串行执行的,即一次仅处理一个表或分区。对于大规模数据库或数据仓库环境,这种串行模式可能导致统计信息收集耗时过长…...
Android Studio:EditText常见4种监听方式
1. 文本变化监听(TextWatcher) TextWatcher 主要用于监听 EditText 里的文本变化,它有三个方法: beforeTextChanged(文本变化前)onTextChanged(文本正在变化时)afterTextChanged&a…...
【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】
在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…...
C++ 网络编程
1. socket Socket 是一种用于网络通信的编程接口,它提供了一种类似于文件描述符的接口,允许不同计算机之间的进程进行通信。Socket 可以工作在多种协议上,最常用的是 TCP/IP 和 UDP/IP 协议 1.1 UDP 1.1.1 概念 UDP(用户数据报协…...