common-lisp
Hashtabeller
Sök…
Skapa ett hashbord
Hashtabeller skapas av make-hash-table
:
(defvar *my-table* (make-hash-table))
Funktionen kan ta nyckelordsparametrar för att ytterligare specificera beteendet hos den resulterande hashtabellen:
-
test
: Väljer funktionen som används för att jämföra tangenter för jämlikhet. Kanske en beteckning för en av funktionernaeq
,eql
,equal
ellerequalp
. Standardvärdet äreq
. -
size
: Ett ledtråd till implementeringen om utrymmet som initialt kan krävas. -
rehash-size
: Om ett heltal (> = 1) kommer hashtabellen att öka sin kapacitet med det angivna numret när du gör en omskalning. Om det annars är en flottör (> 1.0), kommer hashtabellen att öka sin kapacitet till produkten frånrehash-size
och den föregående kapaciteten. -
rehash-threshold
: Anger hur fullständigt hashtabellen måste vara för att utlösa en omväxling.
Iterera över inmatningarna i en hashtabell med maphash
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
Användning av maphash
gör det möjligt att iterera över inmatningarna i en hashtabell. Ordningen på iteration är ospecificerad. Det första argumentet är en funktion som accepterar två parametrar: nyckeln och värdet på den aktuella posten.
maphash
returnerar alltid NIL
.
Iterera över inmatningarna i ett hashbord med slinga
Loop- makroen stöder iteration över tangenterna, värdena eller tangenterna och värdena i en hashtabell. Följande exempel visar möjligheter, men syntaxen med full slinga tillåter fler kombinationer och varianter.
Över nycklar och värden
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for k being each hash-key of ht
using (hash-value v)
collect (cons k v)))
;;=> ((A . 1) (B . 2))
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for v being each hash-value of ht
using (hash-key k)
collect (cons k v)))
;;=> ((A . 1) (B . 2))
Över nycklar
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for k being each hash-key of ht
collect k))
;;=> (A B)
Övervärden
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(loop for v being each hash-value of ht
collect v))
;;=> (1 2)
Iterera över inmatningarna i ett hashtabell med en hastabell iterator
Nycklarna och värdena för en hashtabell kan itereras över med makro med hash-tabell-iterator . Detta kan vara lite mer komplicerat än maphash eller loop , men det kan användas för att implementera iterationskonstruktionerna som används i dessa metoder. with-hash-table-iterator tar ett namn och en hash-tabell och binder namnet i en kropp så att på varandra följande samtal till namnet producerar flera värden: (i) en booleska som indikerar om ett värde är närvarande; (ii) postens nyckel; och (iii) postens värde.
(let ((ht (make-hash-table)))
(setf (gethash 'a ht) 1
(gethash 'b ht) 2)
(with-hash-table-iterator (iterator ht)
(print (multiple-value-list (iterator)))
(print (multiple-value-list (iterator)))
(print (multiple-value-list (iterator)))))
;; (T A 1)
;; (T B 2)
;; (NIL)