B4X编程语言:B4X的映射(数据地图Map)详解
B4X的映射(Map)是由多个键值对组成的数据集合,也称为数据地图。它和列表一样也是一个非可视化的数据容器,在B4X中作为变量使用,用于在单个变量下存储多个键值对。
映射中的键是唯一的。 这意味着,如果您添加了一个键/值对(条目),并且该集合已经保存了一个具有相同键的条目,则前一个条目将从映射中删除。
键应该是一个字符串或一个数字。其对应的值可以是任何类型的对象。
与列表类似,映射可以保存任何对象,但是如果它被声明为 Process_Globals变量,那么它就不能保存活动对象(和视图一样)。
映射对于存储应用程序设置非常有用。
一、声明和初始化映射
映射必须经过初始化后才能被使用。
Private Map1 As Map
Map1.Initialize ' 初始化为空映射
二、给映射添加新条目
Put(Key As Object, Value As Object)
Key:键的名称,在整个映射中必须是唯一的,不能重复。
Value:键对应的值,可以是任何对象。
Map1.Put("Language", "English")
又如:我们将数字1-10和汉字的一到十对应起来建立一个映射:
Dim Map1 As Map
Map1.Initialize
Private row(10) As String=Array As String("一","二","三","四","五","六","七","八","九","十")
For i=1 To 10Map1.Put(i,row(i-1))
Next
三、获取映射的条目
1、Get(Key As Object) As Object
根据给定的键Key获取对应的值。
Log(Map1.Get(5)) ' 输出结果:五
2、GetDefault(Key As Object , Default As Object) As Object
根据给定的键Key获取对应的值。如果键为Key的条目不存在,则返回Default值。
Log(Map1.GetDefault(11,"十一")) ' 输出结果:十一
3、GetKeyAt(Index As Int) As Object (仅B4A和B4J)
根据给定的索引获取相应的键。
Log(Map1.GetKeyAt(8)) ' 输出结果:9
4、GetValueAt(Index As Int) As Object (仅B4A和B4J)
根据给定的索引获取相应的值。
Log(Map1.GetValueAt(8)) ' 输出结果:九
5、ContainsKey(Key As Object) As Boolean
检查映射是否包含一个条目,测试是否有具有给定键的条目。
Log(Map1.ContainsKey(10)) ' 输出结果:True。
四、删除映射的条目
1、Remove(Key As Object) As Object
删除键为Key的条目,如果该条目存在,则删除并返回该条目,如果不存在,返回Null。
Log(Map1.Remove(10)) ' 输出结果:十,说明成功删除键为10,值为十的条目。
2、Clear
删除映射中的所有条目,清空映射。
Map1.Clear
五、映射的其它属性和方法
1、As (Type As Object)
将映射转换为一个不同的对象类型。
Log(Map1.As(String))
2、Size As Int
返回映射大小,也就是映射的条目数。
Dim z As Int = Map1.Size
Map1最后一个条目的索引是Map1.Size-1。
3、IsInitialized As Boolean
检测映射是否已初始化。已初始化返回True;未初始化返回False。
4、Keys As IterableList
返回可用于For Each迭代的所有键的可迭代列表。
For Each k As String In map1.Keys
Log(k)
Next
5、Values As IterableList
返回可用于For Each迭代的所有值的可迭代列表。
For Each v As String In Map1.Values
Log(v)
Next
六、映射文件的保存和读取
通常情况下,映射是以变量形式在其生命周期内驻留在内存的,一旦其生命周期结束,变量自动销毁,映射及其条目将不复存在。对于诸如应用程序设置、关键对象的属性设置等重要且常用的数据,我们需要将其保存到数据库或文件等持久存储中。我们可以使用File对象的ReadMap / WriteMap方法将映射保存为文件,需要时从文件读取映射条目。
1、File.WriteMap(Dir As String, FileName As String, Map As Map)
将映射Map保存为名为FileName的文件,文件目录为Dir。
例如:将映射Map1数据保存到文件settings.txt中
File.WriteMap(File.DirInternal, "settings.txt", Map1)
2、File.ReadMap(Dir As String, FileName As String)
从名为FileName的文件读取映射数据,并将每一行解析为键值对(字符串)。
请注意,映射中的条目的顺序可能与文件中的顺序不相同。
例如:映射Map1从文件settings.txt读取映射数据:
Map1 = File.ReadMap(File.DirInternal, "settings.txt")
3、File.ReadMap2(Dir As String, FileName As String, Map As Map)
类似于ReadMap. ReadMap2 将读取的条目添加到给定的映射的末尾。
通过使用ReadMap2,您可以根据需要强制按条目排序。
例如:
Dim m As Map
m.Initialize
m.Put("Item #1", "")
m.Put("Item #2", "")
m = File.ReadMap2(File.DirApp, "settings.txt", m)
七、映射的数据传递
映射的数据传递采取的也是数据引用的方式,也存在和列表一样的问题。假如Map1将数据传递给Map2,无论哪一个映射的数据条目发生变化,另一个也会发生相同的变化。例如:
Dim Map1 As Map
Map1.Initialize
Map1=File.ReadMap(File.DirData("PreTest"),"test/test1/map.txt")
Dim Map2 As Map=Map1
Log(Map2.Size) ' 输出结果:10
Map1.Remove("10") ' 移除Map1的键为10的条目
Log(Map2.Size) ' 输出结果:9
Map2.Remove("9") ' 移除Map2的键为9的条目
Log(Map1.Size) ' 输出结果:8
要解决这一问题,使两个映射相互独立,Map2应初始化为一个新映射,并遍历Map1的条目添加到Map2中。更改后的代码如下:
Dim Map1 As Map
Map1.Initialize
Map1=File.ReadMap(File.DirData("PreTest"),"test/test1/map.txt")
Dim Map2 As Map
Map2.Initialize
For Each key As String In Map1.KeysMap2.Put(key,Map1.Get(key))
Next
Log(Map2.Size) ' 输出结果:10
Map1.Remove("10") ' 移除Map1的键为10的条目
Log(Map2.Size) ' 输出结果:10
Map2.Remove("9") ' 移除Map2的键为9的条目
Log(Map1.Size) ' 输出结果:9
备注:
1、映射存入文本文件后再读取回来,键和值就都变为字符串,操作映射的键和值时都要用字符串。
2、要更改一个键对应的值,直接使用Put方法:Map1.Put(键名称,值) 添加条目,前面的有相同键的条目会自动删除。要更改一个条目的键名称,需要先使用Put方法:Map1.Put(键名称,值) 添加一个条目,再使用Map1.Remove(键)删除原先的键值对条目。
3、与列表或数组不同,(哈希)映射通常不保留顺序。这是哈希映射工作方式所固有的,并且适用于所有编程语言。B4X 有些例外:B4A 和 B4J 常规映射确实保留了顺序。B4XCollections 中的 B4XOrderedMap 构建为列表 + 映射,它保留了顺序。它实际上允许对键进行排序,这在某些情况下很有用。
4、根据Erel的建议,Map.GetKeyAt / GetValueAt方法目前已弃用,应当使用Map.Get(Key)方法。例如:
'错误代码
For i = 0 To Map1.Size - 1Dim key As String = Map1.GetKeyAt(i)Dim value As String = Map1.GetValueAt(i)
Next'正确代码
For Each key As String In Map1.KeysDim value As String = Map1.Get(key)
Next
相关文章:
B4X编程语言:B4X的映射(数据地图Map)详解
B4X的映射(Map)是由多个键值对组成的数据集合,也称为数据地图。它和列表一样也是一个非可视化的数据容器,在B4X中作为变量使用,用于在单个变量下存储多个键值对。 映射中的键是唯一的。 这意味着,如果您添加了一个键/值对…...
windows C++ 判断文件大小,清空文件,写日志
windows C 判断文件大小,清空文件,写日志等几个常见的接口,记录一下备忘 #include <iostream> #include <vector> #include<Windows.h> #include<string> #include <iostream> #include <sys/types.h> …...
用Python设置Excel工作表的页眉和页脚
在处理和分析数据时,Excel作为一款功能强大的工具,被广泛应用于各个领域。当涉及到打印或分享工作表时,为文档添加专业的页眉和页脚不仅能提升文件的视觉效果,还能提供必要的信息,例如公司标识、日期、文件名或是页码等…...
electron-vite【实战】自定义标题栏【组件封装】(含异形标题栏,指定区域拖拽,窗口置顶,窗口最小化,窗口最大化,取消最大化,隐藏窗口到托盘等)
效果预览 技术要点 透明背景 src/main/index.ts 的 new BrowserWindow 中添加 transparent: true, // 设置窗口背景透明frame: false, // 隐藏窗口边框仅图标和标题部分可拖拽 仅图标和标题部分添加样式 drag .drag {-webkit-app-region: drag; }图标与标题栏的融合 标题栏的…...
MySQL复制问题和解决
目录 环境介绍 一,主库执行delete,从库没有该数据 模拟故障 修复故障 二,主库执行insert,从库已存在该数据 模拟故障 故障恢复 三,主库执行update,从库没有该数据 模拟故障 故障恢复 四…...
Spark和Hive的区别
1 、 Hive Hive 是基于 Hadoop 的数据仓库工具,同时又是查询引擎, Spark SQL 只是取代的 Hive 的查询引擎这一部分,企业可以使用HiveSpark SQL 进行开发。 Hive 的主要工作如下: 把HQL 翻译长 map-reduce 的代码,并…...
Type-C 接口电热毯:开启温暖智能新时代
在当今科技迅猛发展的时代,智能家居产品如同璀璨繁星般点缀着我们的生活,从智能灯光的温馨到温控系统的精准,处处都彰显着科技赋予生活的便捷与舒适。而在这股追求高效与智能化的洪流之中,一款极具创新的电热毯——Type-C 接口电热…...
React 19新特性探索:提升性能与开发者体验
React作为最受欢迎的JavaScript库之一,不断推出新版本以应对日益复杂的应用需求。React 19作为最新的版本,引入了一系列令人兴奋的新特性和改进,旨在进一步提升应用的性能、开发效率和用户体验。 本文将深入探讨React 19的新特性,…...
【数据库】SQL语句基础
【数据库】SQL语句基础 文章目录 【数据库】SQL语句基础一、SQL与数据库二、 SQL语句类型2.1 数据定义语言(DDL)1. 创建数据库:CREATE DATABASE2. 创建表:CREATE TABLE3. 删除表:DROP TABLE4. 修改表结构:A…...
性能】JDK和Jmeter的安装与配置
一、JDK环境配置 1. 下载JDK 官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html 选择对应系统的安装包,下载后安装,安装中记录JDK安装的地址,之后一直点击下一…...
Hadoop、Hbase使用Snappy压缩
1. 前期准备 系统环境:centos7.9 配置信息:8C8G100G hadoop和hbase为单节点部署模式 jdk版本jdk1.8.0_361 1.1. 修改系统时间 timedatectl set-timezone <TimeZone> 1.2. 修改主机名以及主机名和IP的映射 vim /etc/hosts #将自己的主机名以及…...
初试Docker
1. 查看版本 docker --version2. 拉取镜像并查看当前存在的镜像 docker pull hello-world查看是否成功拉取到docker docker images在Docker Desktop 可视化查看 3. 删除镜像 docker rmi xxx4. 启动容器 以下命令使用 mysql镜像启动一个容器,参数为以命令行模…...
【Rust自学】4.5. 切片(Slice)
4.5.0. 写在正文之前 这是第四章的最后一篇文章了,在这里也顺便对这章做一个总结: 所有权、借用和切片的概念确保 Rust 程序在编译时的内存安全。 Rust语言让程序员能够以与其他系统编程语言相同的方式控制内存使用情况,但是当数据所有者超…...
番外:ubuntu 下的sqlite3
What Is SQLite? SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world ps:SQLite Home Page sqlite3 的安装: user…...
全脐点曲面当且仅当平面或者球面的一部分
S 是全脐点曲面当且仅当 S 是平面或者球面的一部分。 S_\text{ 是全脐点曲面当且仅当 }{S_\text{ 是平面或者球面的一部分。}} S 是全脐点曲面当且仅当 S 是平面或者球面的一部分。 证: 充分性显然,下证必要性。 若 r ( u , v ) r(u,v) r(u,v)是…...
Vue之版本演进
一、引言 Vue.js,发音为 /vjuː/,是一款轻量级的用于构建用户界面的渐进式JavaScript框架。自2014年由前Google工程师尤雨溪(Evan You)发布以来,Vue.js凭借其简洁的API、灵活的组件系统以及高效的性能,迅速…...
四川托普信息技术职业学院教案1
四川托普信息技术职业学院教案 【计科系】 周次 第 1周,第1次课 备 注 章节名称 第1章 XML语言简介 引言 1.1 HTML与标记语言 1.2 XML的来源 1.3 XML的制定目标 1.4 XML概述 1.5 有了HTML了,为什么还要发展XML 1.5.1 HTML的缺点 1.5.2 XML的特点 1.6 X…...
《Java核心技术I》Swing中的边框
边框 BorderFactory静态方法创建边框,凹斜面,凸斜面,蚀刻,直线,蒙版,空白。 边框添加标题,BorderFactory.createTitledBorder 组合边框,BorderFactory.createCompoundBorder JCo…...
xlua中自定义lua文件加载的一种方式
此种方法来自LoxodonFramework,这里只做记录 定义一个LoaderBase类,做一个到CustomLoader的隐式类型转换 public abstract class LoaderBase {protected abstract byte[] Load(ref string fileName);/// <summary>/// 隐式类型转换,将…...
Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇
历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...
EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay1
AssignmentBeta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsSixth Assignment——Beta SprintTeam NameFZUGOObjectiveSprint Essay 1_Day1-Day2 (12.11-12.12)Other Reference1. WeChat Mini Program Design Guide 2. Javascript St…...
github如何给本机绑定 ssh密钥(MACOS)
生成 SSH 密钥 如果没有现成的密钥,执行以下命令来生成一个新的 SSH 密钥: ssh-keygen -t rsa -b 4096 -C "替换为你的邮箱" 添加 SSH 密钥到 SSH 代理 在终端中运行以下命令,启动 SSH 代理: eval "$(ssh-agen…...
使用Python实现基于AR的教育应用:打破课堂的墙壁
友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...
【数据分析】层次贝叶斯
文章目录 一、 贝叶斯推理二、 层次贝叶斯模型三、 层次贝叶斯的特点四、 数学表述五、推断方法六、应用领域 层次贝叶斯(Hierarchical Bayesian)方法是一种基于贝叶斯推理的统计模型,用于处理具有多个层次结构的数据模型。 它允许我们在同一…...
linux top命令刷新速度的原理
top命令刷新速度的原理 top命令默认会按照一定的时间间隔(通常是3秒)更新系统资源使用情况的显示内容。它通过读取系统的/proc文件系统中的相关文件(如/proc/stat用于CPU信息、/proc/meminfo用于内存信息等)来获取最新的进程和资源…...
bestphp‘s revenge
bestphp’s revenge 知识点 php session反序列化 解题 <?php highlight_file(__FILE__); $b implode; call_user_func($_GET[f], $_POST); //参数二的位置固定为 $_POST 数组,我们很容易便想到利用 extract 函数进行变量覆盖,以便配合后续利用…...
中化信息与枫清科技深化合作:共探“AI+”产业新生态
随着数字化转型的浪潮席卷全球,数据已成为推动创新和经济增长的关键力量。为持续深化数据要素价值挖掘与应用实践,推动打造行业交流平台,驱动产业创新共荣,2024 年 12 月 18 日 -19 日,由中国通信标准化协会主办的“20…...
Java性能测试Benchmark使用总结
如何测量Java代码的性能 在 Java 中,可以使用多种方法来测量一段代码的执行性能。使用 System.currentTimeMillis()是最常见的方法 long startTime System.currentTimeMillis();// 需要测量的代码块 for (int i 0; i < 1000000; i) {// 示例代码 }long endTi…...
完整微服务设计 功能实现
我们将以一个简单的电商系统为例,实现微服务架构,逐步用Java代码详细实现每个模块,并配合注释帮助小白理解。在这个实现中,我们使用以下工具和框架: Spring Boot:用于构建微服务。Spring Cloud:…...
【Java基础面试题025】什么是Java的Integer缓存池?
回答重点 Java的Integer缓存池(Integer Cache)是为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能 在 -128到127范围内的Integer对象会…...
道可云人工智能元宇宙每日资讯|浙江工商大学发布“人工智能时代创新型人才培养行动计划”
道可云元宇宙每日简报(2024年12月20日)讯,今日元宇宙新鲜事有: 浙江工商大学发布“人工智能时代创新型人才培养行动计划” 12月18日,浙江工商大学发布了《人工智能时代创新型人才培养行动计划》,提出人工…...
树莓派4B 搭建openwrt内置超多插件docker,nas等等使用教程
刷入固件 (想要固件的加我vx wyy7293) bleachwrt-plus-20241112-bcm27xx-bcm2711-rpi-4-squashfs-factory.img上电,并且把网线两头分别插在pi网口上和电脑的网口上(电脑必须断网) 等待网口灯亮,进入192.168.1.1 默认账密 root password 进入系统后更改openwrt的网关地址相关…...
excel 列名是数据表 的字段名 ,单元格的值 是数据表对应字段的值,生成sql插入语句
在 Excel 中,按 Alt F11 打开 VBA 编辑器。在菜单栏选择 插入 -> 模块,在新模块中粘贴以下代码。 VBA 代码 Sub GenerateSQLInsertStatementsToFile()Dim ws As WorksheetDim lastRow As Long, lastCol As Long, i As Long, j As LongDim sql As S…...
【Rust自学】4.3. 所有权与函数
4.3.0 写在正文之前 在学习了Rust的通用编程概念后,就来到了整个Rust的重中之重——所有权,它跟其他语言都不太一样,很多初学者觉得学起来很难。这个章节就旨在让初学者能够完全掌握这个特性。 本章有三小节: 所有权࿱…...
OpenShift 4 - 多云管理(2) - 配置多集群观察功能
《OpenShift / RHEL / DevSecOps 汇总目录》 本文在 OpenShift 4.17 RHACM 2.12 环境中进行验证。 文章目录 多集群观察技术架构安装多集群观察功能监控多集群的运行状态监控多集群的应用运行在被管集群监控应用运行在管理集群监控被管集群的应用运行 参考 多集群观察技术架构…...
【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)
强化学习(Reinforcement Learning, RL)是一种基于试错的方法,旨在通过智能体与环境的交互,学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体(Agent) 执行动作并与环境…...
Docker 设置代理的三种方法(2024年12月19日亲自测试)
Docker 设置代理的三种方法 在 Docker 中设置代理是非常常见的需求,尤其是在某些需要通过代理访问外部资源的网络环境下。本文将介绍三种配置 Docker 使用代理的常见方法:通过 daemon.json 配置镜像加速器、通过 daemon.json 配置 HTTP/HTTPS 代理、以及…...
Pycharm配置Python开发环境
Pycharm配置Python开发环境 在之前的文章中,安装好了Pyhton和Pycharm。 打开Pycharm,如下图 配置完成之后,如下图所示:...
【信息系统项目管理师】高分论文:论信息系统项目的进度管理(一体化智能公共数据平台)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划进度管理2、定义活动3、排列活动顺序5、制定进度计划6、控制进度论文 2022年9月,我作为项目经理参加了XX市的一体化智能公共数据平台项目的建设工作,2022年是XX市政府数字化改革的元年,全市上下…...
Chromium CDP 开发(十):Chromium 中增加自己的Domain
1. 引言 在深入了解了 Chromium CDP(Chrome DevTools Protocol)的开发过程之后,接下来我们将探讨如何创建一个自定义的 CDP Domain。通过为特定功能创建自己的 CDP Domain,可以避免对已有的 CDP 进行侵入式修改,从而更…...
《基于 Python 的网页爬虫详细教程》
一、引言 在当今信息时代,从互联网上获取大量有价值的数据对于许多领域的研究和分析至关重要。网页爬虫是一种自动化程序,可以从网页上抓取所需的数据。Python 作为一种强大的编程语言,拥有丰富的库和工具,使得网页爬虫的开发变得…...
前端知识图谱 - JavaScript基础(变量和类型)
变量和类型 1. JavaScript 规定了几种语言类型? JavaScript 语言的每一个值都属于某一种数据类型,它规定了 7 种语言类型。语言类型广泛用于变量、函数参数、表达式、函数返回值等场合,根据最新的语言标准,这 7 种语言类型如下&…...
五十个网络安全学习项目——(九)无线网络安全分析
五十个网络安全学习项目——(九)无线网络安全分析 这个系列灵感来源是:50个网络安全项目创意:覆盖新手至专家级,本人打算把这些项目都做一遍,做好记录,也算是对自己的提升。 本文将对WAPI 协议…...
10. 考勤信息
题目描述 公司用一个字符串来表示员工的出勤信息 absent:缺勤late: 迟到leaveearly: 早退present: 正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下: 缺勤不超过一次,没有连续的迟到/早退:任意连续7次考勤&a…...
预览和下载 (pc和微信小程序)
1.微信小程序 预览pdf 或者 图片等 //utils.js 文件//通过接口返回文件链接 打开文档 export default function previewFile({ downLinkUrl, tempFilePath }) {let url "https://" downLinkUrl.replace("http://", "").replace("https:…...
Redis 7.x如何安装与配置?保姆级教程
大家好,我是袁庭新。最新写了一套最新版的Redis 7.x企业级开发教程,今天先给大家介绍下Redis 7.x如何在Linux系统上安装和配置。 1 Redis下载与安装 使用非关系型数据库Redis必须先进行安装配置并开启Redis服务,然后使用对应客户端连接使用…...
序列化和反序列化(一)
因为通过这段时间的学习,发现,序列化和反序列化的考点和漏洞在平时遇到的还是比较多的,而且自己也没有特别去学习过这个知识点,所以在这里写一篇关于这里序列化和反序列话的博客,废话就停止在这里了。 在介绍具体的序列…...
1小时放弃Rust(2): 两数之和
1. 目的 陈越姥姥说,ACM拿奖的人有两类,一类是 NOIP 搞了好几年的,另一类是大学才开始搞 ACM 但是专注度远超常人的人。 学习 Rust 大概也是需要高度的专注度。让我试一下 ACM 的入门题目 AB 吧! 2. 题目地址 https://leetcod…...
罗德与施瓦茨NRP33SN,一款独立、特性齐全的功率探头
罗德与施瓦茨NRP33SN功率探头概述 ROHDE & SCHWARZ NRP33S 三路二极管功率传感器 罗德与施瓦茨 NRP33S 三路二极管功率传感器是一款独立 、特性齐全的仪器。它们可以通过罗德与施瓦茨 NRP2 基 本单元、通过 USB 的笔记本电脑/PC 以及许多罗德与施瓦 茨仪器(例如…...
【GoF23种设计模式】02_单例模式(Singleton Pattern)
文章目录 前言一、什么是单例模式?二、为什么要用单例模式?三、如何实现单例模式?总结 前言 提示:设计者模式有利于提高开发者的编程效率和代码质量: GoF(Gang of Four,四人帮)设计…...