当前位置: 首页 > Linux

Zsh开发指南(Part6HashTable)

时间:2023-04-06 01:44:26 Linux

简介哈希表是一种比数组更复杂的数据结构,在某些语言中称为关联数组或字典。简单的说,哈希表就是用来存储指定键(key)对应的值(value)的,键和值的关系就像词典中单词和定义的对应关系。无需从头开始遍历匹配,可以通过单词快速找到意思。准确的说,哈希表只是实现这个功能的一种方式,也可以用各种树或者其他数据结构来实现。不同的实现适用于不同的场景,用法是一样的。但为了简化概念,统一使用哈希表这个名称。哈希表的定义不同于其他变量类型。哈希表需要提前声明,因为哈希表的赋值语法和数组一样。如果不声明,则无法区分。%typeset-Ahashmap#或者用local,两者的功能是一样的%local-Ahashmap#赋值的语法和数组一样,只是顺序是key,value,key,value%hashmap=(k1v1k2v2)#直接使用echo只能输出value%echo$hashmapv1v2#使用(kv)同时输出key和value,(kv)会将key和value放在同一个数组中%echo${(kv)hashmap}k1v1k2v2#哈希表的大小是键值对的个数%echo$#hashmap2哈希表的读写方法和数组类似,不同的是用于定位的数字变成一个字符串。#可以对一行声明赋值%local-Ahashmap=(k1v1k2v2k3v3)%echo$hashmap[k2]v2%hashmap[k2]="V2"#删除元素的方法是和数组不同,引号不能省略%unset"hashmap[k1]"%echo${(kv)hashmap}k2v2k3v3hashtablesplicing#追加元素的方法同array%hashmap+=(k4v4k5v5)%echo$hashmapV2v3v4v5%local-Ahashmap1hashmap2%hashmap1=(k1v1k2v2)%hashmap2=(k2v222k3v3)#拼接哈希表,展开成数组,加上%hashmap1+=(${(kv)hashmap2})#如果key重复,则直接替换value。哈希表的key不重复%echo${(kv)hashmap1}k1v1k2v222k3v3哈希表遍历使用(kv)(k)等先将哈希表转化为数组,再遍历。%local-Ahashmap=(k1v1k2v2k3v3)#traverseonlyvalues%fori($hashmap){>echo$i>}v1v2v3#traverseonlykeys%fori(${(k)hashmap}){>echo$i>}k1k2k3#同时遍历key和value%forkv(${(kv)hashmap}){>echo"$k->$v">}k1->v1k2->v2k3->v3elementlookup检查键是否存在。%local-Ahashmap=(k1v1k2v2k3v3)%(($+hashmap[k1]))&&echogoodgood%(($+hashmap[k4]))&&echogood如果需要判断一个值是否exists,可以直接判断数组的值。但是这样做并不能体现哈希表的优势。%local-Ahashmap=(k1v1k2v2k3v3)#value也不能是哈希表,也可以用local-a%value=($hashmap)%(($value[(i)v1]))&&echogoodgood%(($value[(I)v4]))&&echogood元素排序哈希表的元素排序的方法类似于数组,多了两个选项kv,和其余选项为o(升序)、O(降序)、n(数字大小)、i(忽略大小写)等%local-Ahashmap=(aa33cc11bb22)#对值进行排序only%echo${(o)hashmap}112233#Sortkeysonly%echo${(ok)hashmap}aabbcc#KeysSortvaluestogether%echo${(okv)hashmap}112233aabbcc由字符串,文件构造哈希表因为哈希表可以由数组构造,由字符串,文件,和数组构造哈希表操作是一样的,所以我们就不给了一一举例。%str="k1v1k2v2k3v3"%local-Ahashmap=(${=str})%echo$hashmapv1v2v3对哈希表中的每个元素统一处理哈希表中的每个元素统一处理类似对数组的操作。还有两个选项kv指定是处理key还是value,可以一起处理。没有更多的例子。%local-Ahashmap=(k1v1k2v2k3v3)%print${(U)hashmap}V1V2V3%print${(Uk)hashmap}K1K2K3%print${(Ukv)hashmap}K1V1K2V2K3V3:#也可以用在哈希表上。%local-Ahashmap=(k1v1k2v2k3v3)#排除匹配值%echo${hashmap:#v1}v2v3#只输出匹配的key%echo${(Mk)hashmap:#k[1-2]}k1k2总结这篇文章简单说一下哈希表的基本用法。长度不长,但是因为哈希表的操作和数组的操作类似,所以很多操作数组的方法都可以用在哈希表上,可以把key或者value单独当做一个数组,所以哈希表的操作比较复杂。还有一些更高级的处理数组和哈希表的方法,后面会讲到。本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua等相关问题的付费解决方案,定价灵活,欢迎咨询,微信ly50247。