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 funktionerna eq , eql , equal eller equalp . Standardvärdet är eq .
  • 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ån rehash-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) 


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow