Zsh 开发指南(第六篇 哈希表)

导读

哈希表是比数组更复杂的数据结构,在某些语言里被称作关联数组或者字典等等。简单说,哈希表用于存放指定键(key)对应的值(value),键和值的关系,就像字典中单词和释义的对应关系,通过单词可以快速找到释义,而不需要从头依次遍历匹配。准确地说,哈希表只是该功能的一种实现方式,也可以使用各种树或者其他数据结构来实现,不同的实现方式适合不同的场景,使用方法是一样的。但为了简化概念,统一使用哈希表这个名称。

哈希表定义

和其他变量类型不同,哈希表是需要提前声明的,因为哈希表的赋值语法和数组一样,如果不声明,是无法区分的。

% typeset -A hashmap
# 或者用 local,二者功能是一样的
% local -A hashmap

# 赋值的语法和数组一样,但顺序依次是键、值、键、值
% hashmap=(k1 v1 k2 v2)

# 直接用 echo 只能输出值
% echo $hashmap
v1 v2

# 使用 (kv) 同时输出键和值,(kv) 会把键和值都放到同一个数组里
% echo ${(kv)hashmap}
k1 v1 k2 v2
 
# 哈希表的大小是键值对的数量
% echo $#hashmap
2

元素读写

读写哈希表的方法和数组类似,只是用于定位的数字变成了字符串。

# 可以声明和赋值写到一行
% local -A hashmap=(k1 v1 k2 v2 k3 v3)
% echo $hashmap[k2]
v2

% hashmap[k2]="V2"

# 删除元素的方法和数组不同,引号不能省略
% unset "hashmap[k1]"
% echo ${(kv)hashmap}
k2 V2 k3 v3

哈希表拼接

# 追加元素的方法和数组一样
% hashmap+=(k4 v4 k5 v5)
% echo $hashmap
V2 v3 v4 v5


% local -A hashmap1 hashmap2
% hashmap1=(k1 v1 k2 v2)
% hashmap2=(k2 v222 k3 v3)

# 拼接哈希表,要展开成数组再追加
% hashmap1+=(${(kv)hashmap2})
# 如果键重复,会直接替换值,哈希表的键是不重复的
% echo ${(kv)hashmap1}
k1 v1 k2 v222 k3 v3

哈希表遍历

用 (kv) (k) 等先将哈希表转化成数组,然后再遍历。

% local -A hashmap=(k1 v1 k2 v2 k3 v3)

# 只遍历值
% for i ($hashmap) {
> echo $i
> }
v1
v2
v3

# 只遍历键
% for i (${(k)hashmap}) {
> echo $i
> }
k1
k2
k3

# 同时遍历键和值
% for k v (${(kv)hashmap}) {
> echo "$k -> $v"
> }
k1 -> v1
k2 -> v2
k3 -> v3

元素查找

判断键是否存在。

% local -A hashmap=(k1 v1 k2 v2 k3 v3)
% (($+hashmap[k1])) && echo good
good
% (($+hashmap[k4])) && echo good

如果需要判断某个值是否存在,直接对值的数组判断即可。但这样做就体现不出哈希表的优势了。

% local -A hashmap=(k1 v1 k2 v2 k3 v3)
# value 不能也能是哈希表,也可以用 local -a 强行声明为数组
% value=($hashmap)

% (( $value[(I)v1] )) && echo good
good
% (( $value[(I)v4] )) && echo good

元素排序

对哈希表元素排序的方法,和数组类似,多了 k v 两个选项,其余的选项如 o(升序)、O(降序)、n(按数字大小)、i(忽略大小写)等通用,不再一一举例。

% local -A hashmap=(aa 33 cc 11 bb 22)

# 只对值排序
% echo ${(o)hashmap}
11 22 33

# 只对键排序
% echo ${(ok)hashmap}
aa bb cc

# 键值放在一起排序
% echo ${(okv)hashmap}
11 22 33 aa bb cc

从字符串、文件构造哈希表

因为哈希表可以从数组构造,所以从字符串、文件构造哈希表,和数组的操作是一样的,不再一一举例。

% str="k1 v1 k2 v2 k3 v3"
% local -A hashmap=(${=str})
% echo $hashmap
v1 v2 v3

对哈希表中的每个元素统一处理

对哈希表中的每个元素统一处理,和对数组的操作是类似的,多了 k v 两个选项用于指定是对键处理还是对值处理,可以一起处理。不再一一举例。

% local -A hashmap=(k1 v1 k2 v2 k3 v3)
% print ${(U)hashmap}
V1 V2 V3

% print ${(Uk)hashmap}
K1 K2 K3

% print ${(Ukv)hashmap}
K1 V1 K2 V2 K3 V3

:# 也可以在哈希表上用。

% local -A hashmap=(k1 v1 k2 v2 k3 v3)

# 排除匹配到的值
% echo ${hashmap:#v1}
v2 v3

# 只输出匹配到的键
% echo ${(Mk)hashmap:#k[1-2]}
k1 k2

总结

本篇简单讲了哈希表的基本用法。篇幅不长,但因为哈希表的操作和数组类似,很多操作数组的方法都可以用作哈希表上,而且可以把键或者值单独作为数组处理,所以操作哈希表更为复杂一些。

另外还有一些更进阶的处理数组和哈希表方法,之后会讲到。

本文不再更新,全系列文章在此更新维护:github.com/goreliu/zshguide

付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活定价,欢迎咨询,微信 ly50247。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 今天点开微信看到一则新闻,说是某地的一个产妇,向家里人下跪要求剖腹产,家属不答应,最后忍受不了疼痛而选择轻生! ...
    伊小凡阅读 212评论 0 1
  • 作者/胄宁 我爱这一年的纯粹, 孤独的纯粹, 崩溃的纯粹, 我痛苦的熬过命运的宿醉, 你安享着你的满心疲惫。 我爱...
    胄宁阅读 307评论 0 6