LISP - 哈希表(Hash Table)

  • 简述

    哈希表数据结构代表了一个集合key-and-value根据密钥的哈希码组织的对。它使用键访问集合中的元素。
    当您需要使用键访问元素时使用哈希表,您可以识别一个有用的键值。哈希表中的每个项目都有一个键/值对。密钥用于访问集合中的项目。
  • 在 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 或 equal 之一。如果未指定,则假定为 eql。
    • :size参数设置哈希表的初始大小。应该是一个大于零的整数。
    • :rehash-size参数指定哈希表变满时要增加多少大小。可以是大于零的整数,即要添加的条目数,也可以是大于 1 的浮点数,即新大小与旧大小的比率。此参数的默认值取决于实现。
    • :rehash-threshold参数指定哈希表在必须增长之前可以达到多满。可以是一个大于零且小于 :rehash-size 的整数(在种情况下,只要表增长,它就会被缩放),或者它可以是一个介于 0 和 1 之间的浮点数。个的默认值参数是依赖于实现的。
    您还可以调用不带参数的 make-hash-table 函数。
  • 从哈希表中检索项目并将项目添加到哈希表中

    gethash函数通过搜索其键从哈希表中检索项目。如果找不到密钥,则返回 nil。
    它具有以下语法 -
    
    gethash key hash-table &optional default
    
    说明 -
    • key:是关联的键
    • hash-table: 是要搜索的哈希表
    • default:是要返回的值,如果没有找到该条目,如果没有指定则为 nil。
    gethash函数实际上返回两个值,第二个是谓词值,如果找到条目则为真,如果没有找到条目则为假。
    要将项目添加到哈希表,您可以使用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函数删除哈希表中特定键的任何条目。是一个谓词,如果有条目则为真,否则为假。
    个函数的语法是 -
    
    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 函数

    maphashfunction 允许您对哈希表上的每个键值对应用指定的函数。
    它有两个参数——函数和哈希表,并为哈希表中的每个键/值对调用一次函数。

    例子

    创建一个名为 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)