哈希表Hash Table数据结构表示键和值对的集合,这些对基于键的hashCode进行组织,它使用键来访问集合中的元素。
创建哈希表
在Common LISP中,哈希表是通用集合,您可以使用任意对象作为键或索引。
根据键的比较方式,LISP中的哈希表可以分为三种类型:eq,eql或equal。如果哈希表是在LISP对象上哈希的,则将key与eq或eql进行比较。如果哈希表在树结构上哈希,则将使用equal对其进行比较。
make-hash-table 函数用于创建哈希表。该函数的语法是-
make-hash-table &key :test :size :rehash-size :rehash-threshold
key - 参数提供了键。
:test - 参数确定键的比较方式-它应具有#'eq,#'eql或#'equal三个值之一。默认为eql。
:size - 参数设置哈希表的初始大小。这应该是一个大于零的整数。
:rehash-size - 参数指定当哈希表已满时增加多少。
:rehash-threshold - 参数指定哈希表在必须增长之前可以达到的满度。
您也可以不带任何参数调用make-hash-table函数。
检索与添加数据
gethash 函数通过搜索哈希表的键来从哈希表中检索它,如果找不到key,则返回nil。
它具有以下语法-
gethash key hash-table &optional default
key - 是关联的键
hash-table - 是要搜索的哈希表
default - 如果未找到该元素,则为要返回的值,如果未指定,则为nil。
gethash 函数实际上返回两个值,第二个是断言值,如果找到元素,则为true,如果未找到元素,则为false。
要将项目添加到哈希表,可以将 setf 函数与 gethash 函数一起使用。
检索与添加 - 示例
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(setq empList (make-hash-table)) (setf (gethash '001 empList) '(Charlie Brown)) (setf (gethash '002 empList) '(Freddie Seal)) (write (gethash '001 empList)) (terpri) (write (gethash '002 empList))
当您执行代码时,它返回以下输出-
(CHARLIE BROWN) (FREDDIE SEAL)
删除数据
remhash 函数删除哈希表中特定键的任何元素。成功返回true;否则为false。
该函数的语法是-
remhash key hash-table
删除数据 - 示例
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(setq empList (make-hash-table)) (setf (gethash '001 empList) '(Charlie Brown)) (setf (gethash '002 empList) '(Freddie Seal)) (setf (gethash '003 empList) '(Mark Mongoose)) (write (gethash '001 empList)) (terpri) (write (gethash '002 empList)) (terpri) (write (gethash '003 empList)) (remhash '003 empList) (terpri) (write (gethash '003 empList))
当您执行代码时,它返回以下输出-
(CHARLIE BROWN) (FREDDIE SEAL) (MARK MONGOOSE) NIL
maphash函数
maphash 函数允许您在哈希表的每个键值对上应用指定的函数。
创建一个名为main.lisp的新源代码文件,然后在其中键入以下代码。
(setq empList (make-hash-table)) (setf (gethash '001 empList) '(Charlie Brown)) (setf (gethash '002 empList) '(Freddie Seal)) (setf (gethash '003 empList) '(Mark Mongoose)) (maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) empList)
当您执行代码时,它返回以下输出-
3 => (MARK MONGOOSE) 2 => (FREDDIE SEAL) 1 => (CHARLIE BROWN)