common-lisp
Hashtafels
Zoeken…
Een hashtabel maken
Hash-tabellen zijn gemaakt door make-hash-table
:
(defvar *my-table* (make-hash-table))
De functie kan trefwoordparameters gebruiken om het gedrag van de resulterende hashtabel verder te specificeren:
-
test
: selecteert de functie die wordt gebruikt om toetsen te vergelijken voor gelijkheid. Misschien een aanduiding voor een van de functieseq
,eql
,equal
ofequalp
. De standaardwaarde iseq
. -
size
: een tip voor de implementatie over de ruimte die in eerste instantie mogelijk vereist is. -
rehash-size
: als een geheel getal (> = 1), dan verhoogt de hashtabel de capaciteit bij het herhalen met het opgegeven aantal. Als anders een float (> 1.0), dan verhoogt de hashtabel de capaciteit tot het product van derehash-size
en de vorige capaciteit. -
rehash-threshold
: geeft aan hoe vol de hashtabel moet zijn om een re-hash te activeren.
Herhalen van de invoer van een hashtabel met maphash
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
Met maphash
kunt u de items van een hashtabel herhalen. De volgorde van iteratie is niet gespecificeerd. Het eerste argument is een functie die twee parameters accepteert: de sleutel en de waarde van de huidige invoer.
maphash
retourneert altijd NIL
.
Herhaling van de invoer van een hashtabel met lus
De lusmacro ondersteunt iteratie over de sleutels, de waarden of de sleutels en waarden van een hashtabel. De volgende voorbeelden tonen mogelijkheden, maar de volledige lus- syntaxis biedt meer combinaties en varianten.
Over sleutels en waarden
(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))
Over sleutels
(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)
Over waarden
(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)
De invoer van een hashtabel herhalen met een hashtabel-iterator
De sleutels en waarden van een hashtabel kunnen worden herhaald met behulp van de macro with-hash-table-iterator . Dit kan een beetje ingewikkelder zijn dan maphash of lus , maar het kan worden gebruikt om de iteratieconstructies te implementeren die in die methoden worden gebruikt. with-hash-table-iterator neemt een naam en een hashtabel en bindt de naam binnen een hoofdgedeelte zodat opeenvolgende aanroepen van de naam meerdere waarden produceren: (i) een boolean die aangeeft of een waarde aanwezig is; (ii) de sleutel van de invoer; en (iii) de waarde van de invoer.
(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)