鸿蒙ArkTS实战开发:非线性容器

非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种。非线性容器中的key及value的类型均满足ECMA标准。

HashMap

HashMap可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。

HashMap依据泛型定义,集合中通过key的hash值确定其存储位置,从而快速找到键值对。HashMap的初始容量大小为16,并支持动态扩容,每次扩容大小为原始容量的2倍。HashMap底层基于HashTable实现,冲突策略采用链地址法。

HashMap和TreeMap相比,HashMap依据键的hashCode存取数据,访问速度较快。而TreeMap是有序存取,效率较低。

HashSet基于HashMap实现。HashMap的输入参数由key、value两个值组成。在HashSet中,只对value对象进行处理。

需要快速存取、删除以及插入键值对数据时,推荐使用HashMap。

HashMap进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过set(key: K, value: V)函数每次在HashMap增加一个键值对。
访问元素通过get(key: K)获取key对应的value值。
访问元素通过keys()返回一个迭代器对象,包含map中的所有key值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)访问整个map的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。
修改元素通过replace(key: K, newValue: V)对指定key对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。
删除元素通过remove(key: K)对map中匹配到的键值对进行删除操作。
删除元素通过clear()清空整个map集合。

HashSet

HashSet可用来存储一系列值的集合,存储元素中value是唯一的。

HashSet依据泛型定义,集合中通过value的hash值确定其存储位置,从而快速找到该值。HashSet初始容量大小为16,支持动态扩容,每次扩容大小为原始容量的2倍。value的类型满足ECMA标准中要求的类型。HashSet底层数据结构基于HashTable实现,冲突策略采用链地址法。

HashSet基于HashMap实现。在HashSet中,只对value对象进行处理。

HashSet和TreeSet相比,HashSet中的数据无序存放,即存放元素的顺序和取出的顺序不一致,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。

可以利用HashSet不重复的特性,当需要不重复的集合或需要去重某个集合的时候使用。

HashSet进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(value: T)函数每次在HashSet增加一个值。
访问元素通过values()返回一个迭代器对象,包含set中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。
访问元素通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)访问整个set的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)对set中value进行修改操作。
删除元素通过remove(value: T)对set中匹配到的值进行删除操作。
删除元素通过clear()清空整个set集合。

TreeMap

TreeMap可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。

TreeMap依据泛型定义,集合中的key值是有序的,TreeMap的底层是一棵二叉树,可以通过树的二叉查找快速的找到键值对。key的类型满足ECMA标准中要求的类型。TreeMap中的键值是有序存储的。TreeMap底层基于红黑树实现,可以进行快速的插入和删除。

TreeMap和HashMap相比,HashMap依据键的hashCode存取数据,访问速度较快。而TreeMap是有序存取,效率较低。

一般需要存储有序键值对的场景,可以使用TreeMap。

TreeMap进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过set(key: K,value: V)函数每次在TreeMap增加一个键值对。
访问元素通过get(key: K)获取key对应的value值。
访问元素通过getFirstKey()获取map中排在首位的key值。
访问元素通过getLastKey()获取map中排在未位的key值。
访问元素通过keys()返回一个迭代器对象,包含map中的所有key值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)访问整个map的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。
修改元素通过replace(key: K,newValue: V)对指定key对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。
删除元素通过remove(key: K)对map中匹配到的键值对进行删除操作。
删除元素通过clear()清空整个map集合。

TreeSet

TreeSet可用来存储一系列值的集合,存储元素中value是唯一的。

TreeSet依据泛型定义,集合中的value值是有序的,TreeSet的底层是一棵二叉树,可以通过树的二叉查找快速的找到该value值,value的类型满足ECMA标准中要求的类型。TreeSet中的值是有序存储的。TreeSet底层基于红黑树实现,可以进行快速的插入和删除。

TreeSet基于TreeMap实现,在TreeSet中,只对value对象进行处理。TreeSet可用于存储一系列值的集合,元素中value唯一且有序。

TreeSet和HashSet相比,HashSet中的数据无序存放,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。

一般需要存储有序集合的场景,可以使用TreeSet。

TreeSet进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(value: T)函数每次在TreeSet增加一个值。
访问元素通过values()返回一个迭代器对象,包含set中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。
访问元素通过getFirstValue()获取set中排在首位的value值。
访问元素通过getLastValue()获取set中排在未位的value值。
访问元素通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)访问整个set的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)对set中value进行修改操作。
删除元素通过remove(value: T)对set中匹配到的值进行删除操作。
删除元素通过clear()清空整个set集合。

LightWeightMap

LightWeightMap可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。LightWeightMap依据泛型定义,采用更加轻量级的结构,底层标识唯一key通过hash实现,其冲突策略为线性探测法。集合中的key值的查找依赖于hash值以及二分查找算法,通过一个数组存储hash值,然后映射到其他数组中的key值以及value值,key的类型满足ECMA标准中要求的类型。

初始默认容量大小为8,每次扩容大小为原始容量的2倍。

LightWeightMap和HashMap都是用来存储键值对的集合,LightWeightMap占用内存更小。

当需要存取key-value键值对时,推荐使用占用内存更小的LightWeightMap。

LightWeightMap进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过set(key: K,value: V)函数每次在LightWeightMap增加一个键值对。
访问元素通过get(key: K)获取key对应的value值。
访问元素通过getIndexOfKey(key: K)获取map中指定key的index。
访问元素通过getIndexOfValue(value: V)获取map中指定value出现的第一个的index。
访问元素通过keys()返回一个迭代器对象,包含map中的所有key值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素通过getKeyAt(index: number)获取指定index对应的key值。
访问元素通过getValueAt(index: number)获取指定index对应的value值。
访问元素通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)访问整个map的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。
修改元素通过setValueAt(index: number, newValue: V)对指定index对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。
删除元素通过remove(key: K)对map中匹配到的键值对进行删除操作。
删除元素通过removeAt(index: number)对map中指定index的位置进行删除操作。
删除元素通过clear()清空整个map集合。

LightWeightSet

LightWeightSet可用来存储一系列值的集合,存储元素中value是唯一的。

LightWeightSet依据泛型定义,采用更加轻量级的结构,初始默认容量大小为8,每次扩容大小为原始容量的2倍。集合中的value值的查找依赖于hash以及二分查找算法,通过一个数组存储hash值,然后映射到其他数组中的value值,value的类型满足ECMA标准中要求的类型。

LightWeightSet底层标识唯一value基于hash实现,其冲突策略为线性探测法,查找策略基于二分查找法。

LightWeightSet和HashSet都是用来存储键值的集合,LightWeightSet的占用内存更小。

当需要存取某个集合或是对某个集合去重时,推荐使用占用内存更小的LightWeightSet。

LightWeightSet进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(obj: T)函数每次在LightWeightSet增加一个值。
访问元素通过getIndexOf(key: T)获取对应的index值。
访问元素通过values()返回一个迭代器对象,包含map中的所有value值。
访问元素通过entries()返回一个迭代器对象,包含map中的所有键值对。
访问元素通过getValueAt(index: number)获取指定index对应的value值。
访问元素通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)访问整个set的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)对set中元素进行修改操作。
删除元素通过remove(key: K)对set中匹配到的键值对进行删除操作。
删除元素通过removeAt(index: number)对set中指定index的位置进行删除操作。
删除元素通过clear()清空整个set集合。

PlainArray

PlainArray可用来存储具有关联关系的键值对集合,存储元素中key是唯一的,并且对于PlainArray来说,其key的类型为number类型。每个key会对应一个value值,类型依据泛型的定义,PlainArray采用更加轻量级的结构,集合中的key值的查找依赖于二分查找算法,然后映射到其他数组中的value值。

初始默认容量大小为16,每次扩容大小为原始容量的2倍。

PlainArray和LightWeightMap都是用来存储键值对,且均采用轻量级结构,但PlainArray的key值类型只能为number类型。

当需要存储key值为number类型的键值对时,可以使用PlainArray。

PlainArray进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(key: number,value: T)函数每次在PlainArray增加一个键值对。
访问元素通过get(key: number)获取key对应的value值。
访问元素通过getIndexOfKey(key: number)获取PlainArray中指定key的index。
访问元素通过getIndexOfValue(value: T)获取PlainArray中指定value的index。
访问元素通过getKeyAt(index: number)获取指定index对应的key值。
访问元素通过getValueAt(index: number)获取指定index对应的value值。
访问元素通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)访问整个plainarray的元素。
访问元素通过[Symbol.iterator]():IterableIterator<[number, T]>迭代器进行数据访问。
修改元素通过setValueAt(index:number, value: T)对指定index对应的value值进行修改操作。
修改元素通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)对plainarray中元素进行修改操作。
删除元素通过remove(key: number)对plainarray中匹配到的键值对进行删除操作。
删除元素通过removeAt(index: number)对plainarray中指定index的位置进行删除操作。
删除元素通过removeRangeFrom(index: number, size: number)对plainarray中指定范围内的元素进行删除操作。
删除元素通过clear()清空整个PlainArray集合。

非线性容器的使用

此处列举常用的非线性容器HashMap、TreeMap、LightWeightMap、PlainArray的使用示例,包括导入模块、增加元素、访问元素及修改等操作,示例代码如下所示:

// HashMap
import HashMap from '@ohos.util.HashMap'; // 导入HashMap模块

let hashMap1: HashMap<string, number> = new HashMap();
hashMap1.set('a', 123);
let hashMap2: HashMap<number, number> = new HashMap();
hashMap2.set(4, 123); // 增加元素
console.info(`result: ${hashMap2.hasKey(4)}`); // 判断是否含有某元素
console.info(`result: ${hashMap1.get('a')}`); // 访问元素

// TreeMap
import TreeMap from '@ohos.util.TreeMap'; // 导入TreeMap模块

let treeMap: TreeMap<string, number> = new TreeMap();
treeMap.set('a', 123);
treeMap.set('6', 356); // 增加元素
console.info(`result: ${treeMap.get('a')}`); // 访问元素
console.info(`result: ${treeMap.getFirstKey()}`); // 访问首元素
console.info(`result: ${treeMap.getLastKey()}`); // 访问尾元素

// LightWeightMap
import LightWeightMap from '@ohos.util.LightWeightMap'; // 导入LightWeightMap模块

let lightWeightMap: LightWeightMap<string, number> = new LightWeightMap();
lightWeightMap.set('x', 123);
lightWeightMap.set('8', 356); // 增加元素
console.info(`result: ${lightWeightMap.get('a')}`); // 访问元素
console.info(`result: ${lightWeightMap.get('x')}`); // 访问元素
console.info(`result: ${lightWeightMap.getIndexOfKey('8')}`); // 访问元素

// PlainArray
import PlainArray from '@ohos.util.PlainArray' // 导入PlainArray模块

let plainArray: PlainArray<string> = new PlainArray();
plainArray.add(1, 'sdd');
plainArray.add(2, 'sff'); // 增加元素
console.info(`result: ${plainArray.get(1)}`); // 访问元素
console.info(`result: ${plainArray.getKeyAt(1)}`); // 访问元素

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料

 获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

 有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
具有温度的互连罐是一个常用的非线性模型,可以用于研究物体在温度变化下的热力学特性。该模型可以描述由如水、气体等填充的容器在不同温度条件下的行为。 在Matlab中,我们可以使用不同的方法来开发具有温度的互连罐的非线性模型。一种常用的方法是使用s函数进行建模。S函数是Matlab中的特殊函数,可以用于实现非线性系统的模拟和仿真。 首先,我们需要明确温度对互连罐的影响。温度的变化会导致罐内液体或气体的体积变化,从而影响罐内的压力和流量。因此,我们需要将温度作为输入考虑。 接下来,我们可以使用非线性模型来描述互连罐的动态行为。模型可以包含液体或气体的质量守恒、能量守恒等方程,以及压力和流量之间的关系。 然后,我们可以使用Matlab中的s函数进行模型的线性化。线性化是为了简化模型的复杂性,使其更易于分析和控制。线性化方法可以利用泰勒级数展开和雅可比矩阵等来近似非线性模型。 最后,使用Matlab进行开发,可以根据具体问题的要求,选择合适的数值方法和求解器,对模型进行求解和仿真。可以利用Matlab的工具箱,例如控制系统工具箱和优化工具箱来进行模型分析、控制和优化。 总结而言,具有温度的互连罐的非线性模型和线性化的s函数的Matlab开发可以帮助我们深入研究互连罐在温度变化下的热力学特性,并通过模拟和仿真来获得系统的动态行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值