哈希表的数据结构表示是基于键哈希代码进行组织键 - 值对的集合。它使用键来访问集合中的元素。
哈希表是用于需要使用一键访问元素,可以找出一个有用的键值。在哈希表中每个项目都有一个键/值对。键是用于访问该集合中的项。
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 参数确定键如何比较- 它应该有一个三个值 #&aposeq, #&aposeql 或 #&aposequal或三个符号式之一,eq, eql, 或 equal。如果未指定,则使用eql。
-
:size 参数设置哈希表的初始大小。这应该是一个大于零的整数。
-
:rehash-size%uA0参数指定用多少提高哈希表的大小时已满。这可以是一个大于零的整数,这是添加的项的数量,或者它可以是一个浮点数大于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 &apos001 empList) &apos(Charlie Brown)) (setf (gethash &apos002 empList) &apos(Freddie Seal)) (write (gethash &apos001 empList)) (terpri) (write (gethash &apos002 empList))
当执行代码,它返回以下结果:
(CHARLIE BROWN) (FREDDIE SEAL)
删除条目
remhash函数删除在哈希表中的特定键的任何项。如果是一个谓词,那么它为true,如果没有有一个项则为false。
其函数语法:
remhash key hash-table
示例
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
(setq empList (make-hash-table)) (setf (gethash &apos001 empList) &apos(Charlie Brown)) (setf (gethash &apos002 empList) &apos(Freddie Seal)) (setf (gethash &apos003 empList) &apos(Mark Mongoose)) (write (gethash &apos001 empList)) (terpri) (write (gethash &apos002 empList)) (terpri) (write (gethash &apos003 empList)) (remhash &apos003 empList) (terpri) (write (gethash &apos003 empList))
当执行代码,它返回以下结果:
(CHARLIE BROWN) (FREDDIE SEAL) (MARK MONGOOSE) NIL
maphash函数
maphash函数允许在每个键 - 值对应用一个指定的函数在一个哈希表。
它有两个参数 - 函数和哈希表,并调用该函数一次为每个键/值对的哈希表中。
示例
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
(setq empList (make-hash-table)) (setf (gethash &apos001 empList) &apos(Charlie Brown)) (setf (gethash &apos002 empList) &apos(Freddie Seal)) (setf (gethash &apos003 empList) &apos(Mark Mongoose)) (maphash #&apos(lambda (k v) (format t "~a => ~a~%" k v)) empList)
当执行代码,它返回以下结果:
3 => (MARK MONGOOSE) 2 => (FREDDIE SEAL) 1 => (CHARLIE BROWN)