📜  LISP-哈希表

📅  最后修改于: 2020-11-03 07:18:17             🧑  作者: Mango


哈希表数据结构表示基于键的哈希码组织的键和值对的集合。它使用键来访问集合中的元素。

当需要使用键访问元素时,可以使用哈希表,并且可以识别有用的键值。哈希表中的每个项目都有一个键/值对。该键用于访问集合中的项目。

在LISP中创建哈希表

在Common LISP中,哈希表是通用集合。您可以将任意对象用作键或索引。

将值存储在哈希表中时,您将创建一个键值对,并将其存储在该键下。稍后,您可以使用相同的键从哈希表中检索值。每个键都映射到一个值,尽管您可以在一个键中存储一个新值。

LISP中的哈希表可以根据键的比较方式分为三种类型:eq,eql或equal。如果哈希表是在LISP对象上哈希的,则将密钥与eq或eql进行比较。如果哈希表散列在树结构上,则将使用相等对其进行比较。

make-hash-table函数用于创建哈希表。该函数的语法是-

make-hash-table &key :test :size :rehash-size :rehash-threshold

哪里-

  • key参数提供密钥。

  • :test参数确定键的比较方式-它应该具有三个值#’eq,#’eql或#’equal之一,或三个符号eq,eql或相等之一。如果未指定,则假定为eql。

  • :size参数设置哈希表的初始大小。这应该是一个大于零的整数。

  • :rehash-size参数指定当哈希表已满时增加多少。它可以是大于零的整数,即要添加的条目数,也可以是大于1的浮点数,即新大小与旧大小的比率。此参数的默认值取决于实现。

  • :rehash-threshold参数指定哈希表必须增长之前可以达到的满度。它可以是一个大于零且小于:rehash-size的整数(在这种情况下,它将在表增长时缩放),也可以是一个介于零和1之间的浮点数。此默认值参数是依赖于实现的。

您也可以不带任何参数调用make-hash-table函数。

从哈希表中检索项目并将其添加到哈希表中

gethash函数通过搜索其键从哈希表中检索项目。如果找不到密钥,则返回nil。

它具有以下语法-

gethash key hash-table &optional 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)