Java数据结构第二十二期:Map与Set的高效应用之道(一)
专栏:Java数据结构秘籍
个人主页:手握风云
目录
一、Map和Set
1.1. 概念
二、搜索树
2.1. 概念
2.2. 查找操作
2.2. 插入操作
2.3. 删除操作
2.4. 性能分析
三、搜索
3.1. 概念及场景
3.2. 模型
四、Map
4.1. Map的说明
3.2. Map的使用
五、Set
5.1. Set的使用
一、Map和Set
1.1. 概念
如果一些场景中需要设计到数据搜素相关的操作时,就需要用到上图中的Map和Set接口。Map用于存储键值对,每个键都映射到一个值,键必须是唯一的,但值可以重复,常见的实现类为HashMap、TreeMap。用于存储不重复的元素。它不允许存储重复的值,但不存储键值对,常见的实现类为HashSet、TreeSet。
二、搜索树
2.1. 概念
TreeSet和TreeMap是与二叉搜索树相关的,二叉搜索树底层是用红黑树实现的。二叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:
- 若它的左⼦树不为空,则左⼦树上所有节点的值都⼩于根节点的值;
- 若它的右⼦树不为空,则右⼦树上所有节点的值都⼤于根节点的值;
- 它的左右⼦树也分别为⼆叉搜索树。
2.2. 查找操作
查找的思路是,让需要查找的值key与结点的值域val进行比较。如果key大于val,就去遍历右子树;如果key小于val,就去遍历左子树;如果相等,直接返回这个结点。
public TreeNode root = null;public TreeNode Search(int val) {TreeNode cur = root;while (cur != null) {if (cur.val > val) {cur = cur.left;} else if (cur.val < val) {cur = cur.right;} else {return cur;}}return null;}
上面算法的时间复杂度最好情况下(一棵满二叉树)为,最坏情况下(只有单个分支)时间复杂度为
。
2.2. 插入操作
我们在完成插入操作之后,依然要保证这棵树是一棵二叉搜索树。我们把需要插入的数值val先与根结点的值root.val进行比较,大于在右树插入,小于在左树插入。如下图所示,我们需要将70插入进73的左边,70成为61的右子树,而此时的cur已经为空了。但问题来了,程序没有记录下30的位置,所以我们还需要一个p引用来记录cur走过的前一个位置。当cur为空时,如果val大于p.val,则插入p的右边;如果val小于p.val,则插入p的左边。如果这棵树为空,我们插入第一个结点时,直接让root等于插入的结点就可以。
public void Insert(int val) {TreeNode newNode = new TreeNode(val);if (root == null) {root = newNode;return;}TreeNode cur = root;TreeNode parent = null;while (cur != null) {if (cur.val < val) {parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;} else {return;}}if (parent.val < val) {parent.right = newNode;} else {parent.left = newNode;}}
2.3. 删除操作
删除操作相较于前两个来说比较复杂。如果这个节点没有左右结点,就直接置为空;如果这个结点有左孩子结点或者右孩子结点,就直接将孩子结点变为删除结点的父亲结点的子结点。但如果待删除的结点左右都不为空,该怎么办。
我们要想删除val,就要先查询到该元素。如果要删除的结点为cur,它的父亲结点为parent。我们先假设cur.left为空,且cur是parent.left,那么parent.left=cur.right;再假设cur是parent.right,那么parent.right=cur.right。如下图所示,我们要删除的结点为61。
同理,如果cur.right为空,且cur是parent.left,那么parent.left=cur.left;再假设cur是parent.right,那么parent.right=cur.left。
完整代码实现:
public void Remove(int val){TreeNode cur = root;TreeNode parent = null;while(cur != null){if(cur.val < val){parent = cur;cur = cur.right;}else if(cur.val > val){parent = cur;cur = cur.left;}else{RemoveNode(cur,parent);return;}}}private void RemoveNode(TreeNode cur, TreeNode parent) {if(cur.left == null){if(cur == root){root = root.right;}else if(cur == parent.left){parent.left = cur.right;}else{parent.right = cur.right;}}else if(cur.right == null){if(cur == root){root = root.left;}else if(cur == parent.left){parent.left = cur.left;}else{parent.right = cur.left;}}}
下面是最难的一种情况,就是cur的左右结点都不为空,如果删除,该如何安排它的左右结点。利用替换法,找出一个“替罪羊”,让替换的值去替换我们要删除的结点。比如我们要删除73,在73的左子树找出最大值来替换73,这样就能保证要删除的结点左侧都是比它小的,然后我们去删70。如下图所示,这样就会出现要删除的结点一边为空,一边不为空。
TreeNode target = cur.right;
TreeNode targetParent = cur;
while(target.left != null){targetParent = target;target = target.left;
}
targetParent.left = target.right;
代码写到这里,我们还有一种情况没有考虑到。我们看下图这种情况,81的左边为空,无法进入上面的while循环,那么我们就需要用81替换73。
public void Remove(int val) {TreeNode cur = root;TreeNode parent = null;while (cur != null) {if (cur.val < val) {parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;} else {RemoveNode(cur, parent);return;}}}private void RemoveNode(TreeNode cur, TreeNode parent) {if (cur.left == null) {if (cur == root) {root = root.right;} else if (cur == parent.left) {parent.left = cur.right;} else {parent.right = cur.right;}} else if (cur.right == null) {if (cur == root) {root = root.left;} else if (cur == parent.left) {parent.left = cur.left;} else {parent.right = cur.left;}} else {TreeNode target = cur.right;TreeNode targetParent = cur;while(target.left != null){targetParent = target;target = target.left;}if(target == targetParent.left) {targetParent.left = target.right;}else{targetParent.left = target.right;}}}
2.4. 性能分析
插⼊和删除操作都必须先查找,查找效率代表了⼆叉搜索树中各个操作的性能。 对有n个结点的⼆叉搜索树,若每个元素查找的概率相等,则⼆叉搜索树平均查找⻓度是结点在⼆叉搜 索树的深度的函数,即结点越深,则比较次数越多。
三、搜索
3.1. 概念及场景
Map和set是⼀种专⻔⽤来进⾏搜索的容器或者数据结构,其搜索的效率与其具体的实例化⼦类有关。以前常见的搜索方式有:直接遍历或者二分查找。但这些只能在特定场景下才能使用,一般的情况下效率相对较低。这两种查找比较适合静态类型的查找,即⼀般不会对区间进⾏插⼊和删除操作了。而现实中的查找比如:根据姓名查询考试成绩或者通讯录中根据姓名查询联系方式。
3.2. 模型
⼀般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:
- 纯key模型
有⼀个英⽂词典,快速查找⼀个单词是否在词典中。
- . Key-Value 模型
统计⽂件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数。
Map中存储的就是key-value的键值对,Set中只存储了Key。
四、Map
4.1. Map的说明
Map是⼀个接⼝类,该类没有继承⾃Collection,该类中存储的是结构的键值对,并且K⼀定是唯一的,不能重复。
public interface Map<K, V>
interface Entry<K, V>
我们可以看下Structure里面,Map内部又实现了一个接口Entry,可以理解为二叉搜索树里的TreeNode。
3.2. Map的使用
方法 | 说明 |
V get(Object key) | 返回key对应的value值 |
V getOrDefault(Object key,V defaultValue) | 返回key对应的value值,若key不存在,返回默认值 |
V put<key,value> | 设置key对应的value |
V remove<Object key> | 删除key的映射关系 |
Set<K> keySet() | 返回所有key的不重复集合 |
Collection<V> values() | 返回所有value的可重复集合 |
Set<Map.Entry<K,V>> entrySet() | 返回key-value的所有映射关系 |
boolean containsKey(Object key) | 判断是否包含key |
boolean containsKey(Object value) | 判断是否包含value |
import java.util.Collection;
import java.util.Set;
import java.util.TreeMap;public class Solution {public static void main(String[] args) {TreeMap<Character,Integer> tree1 = new TreeMap<>();//底层是二叉搜索树,要想实现插入与删除,进行的是k的比较//如果k是其他类,那么这个类必须是可比较的tree1.put('a',1);tree1.put('b',2);tree1.put('c',3);tree1.put('d',4);tree1.put('e',5);tree1.put('a',1);tree1.put('b',2);tree1.put('c',3);tree1.put('x',1);tree1.put('y',2);tree1.put('z',3);System.out.println(tree1.get('a'));//根据key获取value,打印1tree1.put('a',10);//设置key对应的value是唯一的System.out.println(tree1.get('a'));//打印10System.out.println(tree1.get('e'));//返回nullSystem.out.println(tree1.getOrDefault('f',6));System.out.println(tree1.containsKey('c'));System.out.println(tree1.containsKey('f'));Set<Character> setTree = tree1.keySet();System.out.println(setTree);Collection<Integer> collection = tree1.values();System.out.println(collection);Integer in = tree1.remove('a');System.out.println(in);}
}
注意:
- Map是⼀个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者 HashMap
- 在TreeMap中插⼊键值对时,key不能为空,否则就会抛NullPointerException异常,value可以 为空。但是HashMap的key和value都可以为空。
- Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然 后再来进行重新插入。
五、Set
Set与Map主要的不同有两点:Set是继承⾃Collection的接⼝类,Set中只存储了Key。
5.1. Set的使用
方法 | 说明 |
boolean add(E,e) | 添加元素,但重复元素不会被添加 |
void clear() | 清空集合 |
boolean contains(Object o) | 判断o是否在集合中 |
Iterator<E> Iterator() | 返回迭代器 |
boolean remove(Object o) | 删除集合中的o |
int size() | 返回集合中的元素个数 |
boolean isEmpty() | 检查集合是否为空 |
Object[] toArray() | 将集合中的元素转化成数组 |
boolean containsAll(Collection<?> c) | 集合c中的元素是否全部存在于集合set中 |
boolean addAll(Collection<? extends E> c) | 将集合c中的元素添加进set中 |
import java.util.Iterator;
import java.util.TreeSet;public class Solution {public static void main(String[] args) {TreeSet<String> tree = new TreeSet<>();System.out.println(tree.isEmpty());//集合是否为空tree.add("abc");//添加tree.add("def");tree.add("hello");tree.add("world");tree.add("hello");//只能添加一个System.out.println(tree);System.out.println(tree.isEmpty());System.out.println(tree.contains("abc"));//判断是否存在集合中System.out.println(tree.contains("bac"));System.out.println(tree.size());//获取长度String[] array = tree.toArray(new String[3]);//转化成数组for (String i: array) {System.out.print(i+" ");}System.out.println();tree.remove("world");//删除元素System.out.println(tree);Iterator<String> it = tree.iterator();while (it.hasNext()){System.out.print(it.next()+" ");}}
}
Set中只存储了key,并且要求key⼀定要唯一,TreeSet的底层是使用Map来实现的,其使⽤key与Object的⼀个默认对象作为键值对插⼊到Map中的。我们来看一下TreeSet的构造方法的源码:
public TreeSet() {this(new TreeMap<>());}
TreeSet(NavigableMap<E,Object> m) {this.m = m;}
public interface NavigableMap<K,V> extends SortedMap<K,V>
public interface SortedMap<K,V> extends Map<K,V>
public boolean add(E e) {return m.put(e, PRESENT)==null;}
上面的TreeMap传给了m,m是NavigableMap类型的,而NavigableMap又继承了Map,我们再来看add方法,里面的e接收了key,PRESENT接收了value,而这个PRESENT又是一个Object类。
private transient NavigableMap<E,Object> m;
相关文章:
Java数据结构第二十二期:Map与Set的高效应用之道(一)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、Map和Set 1.1. 概念 二、搜索树 2.1. 概念 2.2. 查找操作 2.2. 插入操作 2.3. 删除操作 2.4. 性能分析 三、搜索 3.1. 概念及场景 3.2. 模型 四、Map 4.1. Map的说明 3.2. Map的使用 五…...
焊接安全的新纪元:智能监管系统的力量
在现代制造业中,焊接作为一项关键工艺,其安全性直接关系到生产质量和人员安全。为了应对这一挑战,一款创新的焊接联网智能化监管系统应运而生,为焊接行业带来了新的安全保障。 智能监管,安全升级 这款系统通过“一机…...
OpenGL中绘制图形元素的实现(使用visual studio(C++)绘制一个矩形)
目标:使用OpenGL提供的函数绘制矩形、线段、三角形等基本图形元素 所需效果 实验步骤 1、配置OpenGL(详情参见OpenGL的配置) 2、头文件引入 #include <gl/glut.h> 3、编写方法体 1>矩形实现 //绘制矩形 void DisplayRectangl…...
政安晨【零基础玩转各类开源AI项目】Wan 2.1 本地部署,基于ComfyUI运行,最强文生视频 图生视频,一键生成高质量影片
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 下载项目 创建虚拟环境 安装项目依赖 尝试运行 依次下载模型 完成 我们今天要使…...
DeepLabv3+改进8:在主干网络中添加SIM注意力机制|助力涨点
🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 论文简介 在本文中,我们提出了…...
卷积神经网络(笔记01)
视觉处理三大任务:分类、目标检测、图像分割 CNN网络主要有三部分构成:卷积层(Convolutional Layer)、池化层(Pooling Layer)和激活函数 一、解释卷积层中的偏置项是什么,并讨论在神经网络中引…...
从自己电脑的浏览器访问阿里云主机中运行的LLaMA-Factory webui
阿里云主机上LLaMA-Factory的webui在0.0.0.0:7860侦听,无法直接打开,需要通过代理的方法访问。 在LLaMA-Factory目录下创建一个脚本文件run.sh,并加上执行权限,内容如下: #!/bin/shexport GRADIO_SERVER_PORT7860 ex…...
大数据面试之路 (一) 数据倾斜
记录大数据面试历程 数据倾斜 大数据岗位 ,数据倾斜面试必问的一个问题。 一、数据倾斜的表现与原因 表现 某个或某几个Task执行时间过长,其他Task快速完成。 Spark/MapReduce作业卡在某个阶段(如reduce阶段),日志显…...
文件上传漏洞 upload-labs靶场
(这个没删就是还没做完 ; ω ; ) 目录 Pass-01 前端绕过 关卡分析 绕过:Burpsuite抓包修改或页面禁用js Pass-02 服务器端检测–IMME类型 关卡分析 Content-type 绕过:抓包修改文件的content-type Pass-03 黑名单绕过 关…...
「 DelegateUI 」Ant-d 风格的 Qt Qml UI 套件
写在前面:关于为什么要写一套新的UI框架 一方面,Qt Qml 生态中缺乏一套既遵循现代设计规范(自带的功能少且丑,懂得都懂),又能深度整合 Qt 生态的开源组件库。 另一方面,Qt Qml 中也有一些其他方案,例如 FluentUI Qml…...
数字人分身开发指南:从概念到实战
一、什么是数字人分身? 想象一下,在电脑或手机屏幕里,一个能跟你聊天、回答问题,甚至还能做表情的虚拟角色。这就是数字人分身,它用上了人工智能技术,让机器也能像人一样交流。无论是在线客服、网络主播还…...
Java小白-管理项目工具Maven(2)初识Maven
一、Maven安装 ①安装jdk1.8或以上版本 ②下载Maven(此为3.6.0):地址:Download Apache Maven – Maven 下载地址:Index of /dist/maven/maven-3/3.6.0/binaries ③安装Maven到无中文路径即可 bin:含…...
【附JS、Python、C++题解】Leetcode 面试150题(8)
一、题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。你不能倾斜…...
什么是向量数据库向量搜索?
向量数据库 专为高效存储与检索高维向量设计,支持语义搜索、推荐系统等AI场景,如文本/图像嵌入的相似性匹配。 ChromaDB 轻量级开源向量数据库,优势在于易用性(快速部署、简洁API)和小规模场景(本地开发、…...
【WRF-Urban】使用 LCZ 替换 WRF 运行中的 LUCC 数据
使用 LCZ 替换 WRF 运行中的 LUCC 数据 WRF-UCM中的城市类型LCZ的背景介绍完整步骤总结1. 获取 LCZ 数据2. 获取 WRF 运行所需的 LUCC 数据3. 使用 w2w 替换 WRF 的 LUCC 数据4. 运行 WRF 预处理(WPS & REAL)5. 运行 WRF 并优化城市参数化Q1:使用 LCZ 替换 WRF 运行中的…...
centos 7 安装apache服务
四步骤 解包 使用tar -zxvf 对.tar.gz 进行解压 使用tar -jxvf 对.tar.bz2 进行解压 rpm命令使用集合 rpm -qa 查询系统已安装的软件包 rpm -ql查看指定软件包存放的位置 rpm -qi查看指定软件包的属性 rpm -qf查看指定文件或目录是由哪个软件包所安装的 rpm -qpi查看指…...
2025各省市建筑产业和工程建设计划安排
1. 前言 十四届全国人大三次会议3月5日上午9时在人民大会堂开幕,国务院总理李强作政府工作报告。 《2025年政府工作报告》(以下简称 “报告”)作为统筹国家经济、战略布局与社会发展的蓝图,与建筑业息息相关,为今后的…...
广告营销,会被AI重构吗?
DeepSeek设计,即梦AI绘图,剪映成片。 DeepSeek的热度还在高开疯走。 用户对于各个场景下DS应用的探索也还在持续,各种DS的模式被挖掘出来,超级个体们开始给手下的大模型团队进行分工,实践出各种场景下最佳的排列组合方…...
01 音视频知识学习(视频)
图像基础概念 ◼像素:像素是一个图片的基本单位,pix是英语单词picture的简写,加上英 语单词“元素element”,就得到了“pixel”,简称px,所以“像素”有“图像元素” 之意。 ◼ 分辨率:是指图像…...
深入探究 Ryu REST API
Ryu 4.34 REST API 详细接口说明与示例 Ryu 4.34 的 REST API 提供了对 SDN 网络的核心管理功能,涵盖交换机、流表、端口、拓扑和 QoS 等操作。以下是详细的接口分类、功能说明及 Python 示例代码。 1. 交换机管理 1.1 获取所有交换机 DPID 端点: GET /stats/swi…...
不同AI生成的PHP版雪花算法
OpenAI <?php /*** Snowflake 雪花算法生成器* 生成的 64 位 ID 结构:* 1 位 保留位(始终为0,防止负数)* 41 位 时间戳(毫秒级,当前时间减去自定义纪元)* 5 位 数据中心ID* 5 …...
texstudio: 编辑器显示行号+给PDF增加行号
texstudio在编辑器部分增加行号: texstudio默认在编辑器部分不显示行号,如下图: 要实现以下的在编辑部分增加行号: 执行如下操作: 选项-->设置TexStudio-->编辑器-->显示行号-->所有行号选择好后&…...
强化学习基础-马尔可夫决策过程与贝尔曼方程
马尔可夫决策过程 在老虎机问题中,无论智能代理采取什么行动,之后要解决的问题都是一样的。也就是寻找最好的老虎机。但现实生活中的问题是不同的。例如,在围棋游戏中,智能代理落子后,棋盘上的棋子排列会发生变化&…...
爬虫的精准识别:基于 User-Agent 的正则实现
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Scala的初步使用
目录 1. Scala简介2. Scala编写的Hello World2.1 pom.xml中依赖和插件的配置2.2 安装Scala2.12.172.3 安装code-server插件2.4 helloworld.scala2.5 helloworld2.scala2.6 java调用scala object 3. Scala调用Java3.1 例子13.2 例子2 参考 1. Scala简介 Scala是一门多范式的编程…...
【Json RPC框架】框架介绍与环境搭建(Ubuntu 22.04)
🎁个人主页:我们的五年 🔍系列专栏:Json RPC框架 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 JSon RPC框架系列文章Json RPC框架_我们的五年的博…...
python读取word文档 | AI应用开发
python读取word文档 | AI应用开发 RAG中python读取word文档 RAG系统中构建知识库流程中重要的一个步骤是读取外挂的知识文档,为word是其中比较常见的文件。 另一个值得注意的是,RAG在读取文档后需要对文档进行分割,而良好的分割需要有一定结…...
20、组件懒加载
组件懒加载,也被称为异步组件加载,是一种在 Vue 项目中提升性能的重要技术手段。下面从概念、实现原理、使用场景、实现方式几个方面详细介绍: 概念 在传统的 Vue 项目里,当应用启动时,所有的组件代码都会被一次性加…...
打造智能钉钉机器人:借助智谱GLM-4-Flash实现高效智能回复(文末附源码)
文章目录 前言一、准备工作(一)钉钉机器人(二)智谱 GLM-4-Flash(三)内网穿透工具 cpolar(四)需要准备的工具和环境 二、钉钉机器人的创建与配置步骤1:创建钉钉机器人步骤…...
【故障处理系列--docker卷的挂载】
一位伙伴需求是把容器的目录映射到宿主机且容器目录的内容不被宿主机的空白目录覆盖。我的第一反应是-v 卷的映射,参数是对的,但是用法是错的 1、容器卷的挂载方式 容器把目录映射到宿主机创建volume卷,然后把容器的目录和volume卷绑定 区别…...
兴达易控modbusTCP转profinet接防撞雷达测试
modbusTCP转profinet接防撞雷达测试 随着工业自动化程度的不断提高,现场设备之间的通信需求日益增长。ModbusTCP作为一种广泛应用的工业通信协议,因其简单、可靠的特点,被广泛应用于各种自动化设备中。而Profinet作为工业以太网的一种&#…...
Acknowledgment.nack方法重试消费kafka消息异常
文章目录 问题示例异常 原因nack方法Acknowledgment接口实现类:ConsumerAcknowledgment实现类:ConsumerBatchAcknowledgment 解决方案1 批量消费指定index示例 2 单条消费示例 问题 使用BatchAcknowledgingMessageListener 批量消费Kafka消息࿰…...
通过动态获取后端数据判断输入的值打小
eval() 函数在 JavaScript 中是一个非常强大的函数 【1】计算简单公式 很多时候如果需要动态的提供计算的公式,需要写一大段的公式计算逻辑去兼容,可能耗费大量的开发成本。为了快速了解 eval 的用法,直接 ① 打开浏览器;② F1…...
乐维网管平台核心功能解析(一)——告警关联知识
在数字化转型浪潮中,企业IT系统规模呈指数级增长,传统的"人工经验"运维模式已难以应对海量告警处理需求。某银行数据中心曾统计,其日均告警量突破10万条,关键故障的平均定位时间长达3.5小时,直接导致年损失超…...
数据结构_单链表
今天我们要开启链表的学习 🖋️🖋️🖋️ 学了顺序表我们可以知道: 🎈链表其实就是争对顺序表的缺点来设计的,补足的就是顺序表的缺点 🎈链表在物理上是上一个节点存放的下一个节点的地址 链表 …...
b站视频下载工具软件怎么下载
自行配置FFMPEG环境 请优先选择批量下载,会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示,视频音频文件无法合并生成mp4文件 更新批量下载标题,只取视频原标题,B站反爬机制登陆后下载多了…...
如何实现pinia的持久化存储
在 Vue 3 项目中使用 Pinia 进行状态管理时,若要实现持久化存储,可借助 pinia-plugin-persistedstate 插件,该插件能让 Pinia 存储的状态在页面刷新或关闭后依然保留。下面为你详细介绍实现步骤: 1. 安装插件 首先,在…...
webpack介绍
entry与output 入口是 Webpack 开始构建依赖图的起点,Webpack 会从入口文件开始,递归地分析项目的依赖图。输出指定 Webpack 打包后的文件存放位置和文件名。 const path require("path");module.exports {entry: "./src/index.js&qu…...
使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图
以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图: graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …...
蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…...
【spring bean的生命周期】
以下是使用 Mermaid 绘制的 Spring Bean 生命周期流程图: 流程说明 实例化:Spring 容器创建 Bean 的实例。属性赋值:Spring 为 Bean 的属性注入值(依赖注入)。BeanPostProcessor.postProcessBeforeInitialization&…...
数据类设计_图片类设计之3_半规则图类设计(前端架构基础)
前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇讨论半规则图类型的设计 半规则图的定义 什么是半规则图?笔者看见了一些似乎规则又不是太规则的图形,例如带圆角的矩阵,在页面上找一个圆角框 为了…...
【leetcode hot 100 138】随机链表的复制
解决一:回溯 哈希表 本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建…...
如何安全处置旧设备?
每年,数百万台旧设备因老化、故障或被新产品取代而被丢弃,这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据,这些数据往往仍可被恢复。因此,安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…...
Windows 万兴恢复专家 Wondershare Recoverit-v13.5.7.9-[电脑数据恢复工具]
Windows 万兴恢复专家Wondershare_Recoverit 链接:https://pan.xunlei.com/s/VOL3z608vzAj_IYTvH-F1q7kA1?pwdiu89# 1. 打开Setup.exe进行安装,安装完不要打开软件,记住安装目录 2. 将"Crack"文件夹内的所有文件复制到安装目录 …...
eLection: 1靶场渗透测试
eLection: 1 来自 <eLection: 1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.196 3,对靶机进行端口服…...
类与对象(下)
1 . 再谈构造函数 1.1构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class B { public:B(int a0){_a a;} private:int _a; };虽然上述构造函数调用之后,对象中已经有了一个初始值…...
数字人源头技术搭建模型--v10追踪推理逻辑
数字人源头技术搭建模型--v10追踪推理逻辑 #数字人# #数字人技术源头saas开发# 数字人源头技术搭建模型V10的追踪推理逻辑通常涉及以下几个关键方面: 数据收集与预处理 - 多模态数据采集:收集图像、音频等多模态数据。例如通过摄像头采集人物的面部…...
基于Asp.net的高校迎新管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
商业智能BI的未来,如何看待AI+BI这种模式?
昨天在和一位朋友线上聊天的时候,提了一个问题,你是如何看待AI(人工智能)BI(商业智能)这种模式和方向的,我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业,…...