鍍金池/ 教程/ Java/ LISP - 哈希表
LISP - 樹
LISP - 錯誤處理
LISP - 謂詞
LISP - 決策
LISP - 變量
LISP - 數(shù)組
LISP - 對象系統(tǒng)(CLOS)
LISP - 輸入和輸出
Lisp教程
LISP - 數(shù)字
LISP - 循環(huán)
LISP - 常量
LISP - 集合
LISP - 字符
LISP - 程序結(jié)構(gòu)
LISP - 文件I/O
LISP - 哈希表
LISP - 宏
LISP - 數(shù)據(jù)類型
LISP - 包
LISP - 符號
LISP - 運算符
LISP - 基本語法
LISP - 函數(shù)
LISP - 向量
LISP - 結(jié)構(gòu)
LISP - 概述介紹

LISP - 哈希表

哈希表的數(shù)據(jù)結(jié)構(gòu)表示是基于鍵哈希代碼進行組織鍵 - 值對的集合。它使用鍵來訪問集合中的元素。

哈希表是用于需要使用一鍵訪問元素,可以找出一個有用的鍵值。在哈希表中每個項目都有一個鍵/值對。鍵是用于訪問該集合中的項。

LISP中創(chuàng)建哈希表

在Common Lisp中表是一種通用的集合??梢噪S心所欲的使用對象作為一個鍵或索引。

當在一個哈希表中存儲的值,設(shè)置鍵 - 值對,并將其存儲在該鍵。以后可以從哈希表中使用相同的key檢索值。每個鍵映射到一個單一的值,雖然可以在一鍵保存新值。

哈希表,在LISP,可分為三種類型,基于這樣的鍵所不能compared - eq, eql 或 equal。如果哈希表進行哈希處理的LISP對象然后將鑰匙與eq或eql比較。如果在樹結(jié)構(gòu)中的哈希表散列,那么它會使用相等比較。

make-hash-table函數(shù)用于創(chuàng)建一個哈希表。此函數(shù)語法的是:

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

那么:

  • key 參數(shù)提供了鍵。

  • :test 參數(shù)確定鍵如何比較- 它應(yīng)該有一個三個值 #'eq, #'eql 或 #'equal或三個符號式之一,eq, eql, 或 equal。如果未指定,則使用eql。

  • :size 參數(shù)設(shè)置哈希表的初始大小。這應(yīng)該是一個大于零的整數(shù)。

  • :rehash-size 參數(shù)指定用多少提高哈希表的大小時已滿。這可以是一個大于零的整數(shù),這是添加的項的數(shù)量,或者它可以是一個浮點數(shù)大于1,這是新的尺寸,以舊的大小的比率。該參數(shù)的默認值是實現(xiàn)相關(guān)。

  • :rehash-threshold 參數(shù)指定的哈希表如何能充分得到之前,它必須成長。這可以是一個大于零的整數(shù),并且小于 :rehash-size(在這種情況下,每當該表是生長其將被縮小),或者它可以是零和1之間的浮點數(shù)此默認值。參數(shù)是實現(xiàn)相關(guān)的。

也可以調(diào)用 make-hash-table函數(shù)的無參數(shù)形式。

正在從項和新增項到哈希表

gethash函數(shù)通過搜索其鍵檢索從哈希表中的項。如果沒有找到鍵,那么它返回nil。

它的語法如下:

gethash key hash-table &optional default

那么:

  • key: 是相關(guān)聯(lián)的鍵

  • hash-table: 是要被搜索的哈希表

  • default: 要返回的值,如果沒有找到該入口,它是nil,如果不是指定的值。

gethash函數(shù)實際上返回兩個值,第二個是一個謂詞值,如果發(fā)現(xiàn)一個項則是true;如果被發(fā)現(xiàn)沒有項目返回false。

對于將項添加到哈希表中,可以使用setf函數(shù)及gethash函數(shù)。

示例

創(chuàng)建一個名為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))  

當執(zhí)行代碼,它返回以下結(jié)果:

(CHARLIE BROWN)
(FREDDIE SEAL)

刪除條目

remhash函數(shù)刪除在哈希表中的特定鍵的任何項。如果是一個謂詞,那么它為true,如果沒有有一個項則為false。

其函數(shù)語法:

remhash key hash-table

示例

創(chuàng)建一個名為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))  

當執(zhí)行代碼,它返回以下結(jié)果:

(CHARLIE BROWN)
(FREDDIE SEAL)
(MARK MONGOOSE)
NIL

maphash函數(shù)

maphash函數(shù)允許在每個鍵 - 值對應(yīng)用一個指定的函數(shù)在一個哈希表。

它有兩個參數(shù) - 函數(shù)和哈希表,并調(diào)用該函數(shù)一次為每個鍵/值對的哈希表中。

示例

創(chuàng)建一個名為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)

當執(zhí)行代碼,它返回以下結(jié)果:

3 => (MARK MONGOOSE)
2 => (FREDDIE SEAL)
1 => (CHARLIE BROWN)

上一篇:LISP - 字符下一篇:LISP - 符號