LISP - 哈希表 - Lisp教程

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

哈希表是用于需要使用一键访问元素,可以找出一个有用的键值。在哈希表中每个项目都有一个键/值对。键是用于访问该集合中的项。

LISP中创建哈希表

在Common Lisp中表是一种通用的集合。可以随心所欲的使用对象作为一个键或索引。

当在一个哈希表中存储的值,设置键 - 值对,并将其存储在该键。以后可以从哈希表中使用相同的key检索值。每个键映射到一个单一的值,虽然可以在一键保存新值。

哈希表,在LISP,可分为三种类型,基于这样的键所不能compared - 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, 或 equal。如果未指定,则使用eql。

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

  • :rehash-size 参数指定用多少提高哈希表的大小时已满。这可以是一个大于零的整数,这是添加的项的数量,或者它可以是一个浮点数大于1,这是新的尺寸,以旧的大小的比率。该参数的默认值是实现相关。

  • :rehash-threshold 参数指定的哈希表如何能充分得到之前,它必须成长。这可以是一个大于零的整数,并且小于 :rehash-size(在这种情况下,每当该表是生长其将被缩小),或者它可以是零和1之间的浮点数此默认值。参数是实现相关的。

也可以调用 make-hash-table函数的无参数形式。

正在从项和新增项到哈希表

gethash函数通过搜索其键检索从哈希表中的项。如果没有找到键,那么它返回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)