哈希

哈希表 属于 Common Lisp

4 个练习

关于 哈希表

Common Lisp 中的哈希表是用于存储关联数据的数据结构。 它们把键(可以是任何对象)映射到值(可以是任何对象)。

创建哈希表

哈希表可以用make-hash-table函数来创建。

make-hash-table函数接受若干关键字形参,用来微调哈希表的初始大小以及扩容阈值;完整信息请参阅文档。 更重要的是,它还接受一个test关键字形参,用来定义在插入、查找和删除键和值时如何比较键。 test实参的值可以是'eq、'eql、'equal或'equalp之一,它们对应通用相等谓词。 默认值是'eql。

哈希表的常见操作

要按键取值,可以使用gethash。 gethash接受一个[可选实参][concept-defualt-arguments],当哈希表中不存在该键时,这个实参就作为要返回的值。 gethash还会返回多个值(将在另一个概念中讲解)。 第一个值是哈希表中该键对应的值;如果提供了默认值,则为该默认值;否则是NIL。 第二个值是一个布尔值,表示该键在哈希表中是否存在。

要插入键值对,可以用setf配合gethash。

要删除某个键及其值,使用remhash。

要删除所有键和值,使用clrhash。

Common Lisp 中的哈希表和其他语言一样,并不保证顺序,但有时逐一遍历、处理每个键值对会很有用。 这可以用maphash来完成:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(这会把每个键和值作为一个 cons 对打印出来,每行一个。)

参考

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 哈希表

练习已锁定

再解锁 3 个练习即可练习 哈希表