位置:首頁 > 高級語言 > Lisp教學 > 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)