雜湊

雜湊表 在 Common Lisp

4 個練習

關於 雜湊表

Common Lisp 中的雜湊表是用來儲存關聯性資料的資料結構。 它們會把鍵(可以是任何物件)對應到值(可以是任何物件)。

建立雜湊表

雜湊表可以用make-hash-table函式建立。

make-hash-table函式接受數個關鍵字參數,用來微調雜湊表的初始大小以及重新調整大小的門檻;完整資訊請參閱文件。 更重要的是,它還接受一個test關鍵字參數,用來定義在插入、查詢與移除鍵和值時,鍵要如何比較。 test引數的值可以是'eq、'eql、'equal或'equalp其中一個,它們分別對應到通用相等述詞。 預設值是'eql。

雜湊表的常見操作

要用鍵取得值,可以使用gethash。 gethash接受一個[選用引數][concept-defualt-arguments],當雜湊表中沒有這個鍵時,就會回傳這個引數的值。 gethash也會回傳多重值(另一個概念會說明這部分)。 第一個值是該鍵在雜湊表中的值、有提供時的預設值,或是NIL。 第二個值是布林值,指出該鍵是否存在於雜湊表中。

要插入一組鍵值配對,可以搭配gethash使用setf。

要移除某個鍵和它的值,請使用remhash。

要移除所有的鍵和值,請使用clrhash。

雖然 Common Lisp 的雜湊表和其他語言一樣不保證順序,但有時候逐一處理每一組鍵值還是很有用。 這件事可以用maphash做到:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(這會把每個鍵和值以 cons 配對的形式印出,一行一組。)

參考

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 雜湊表

練習已鎖定

再解鎖 3 個練習,就能練習 雜湊表