common-lisp
Tabelle hash
Ricerca…
Creazione di una tabella hash
Le tabelle hash sono create da make-hash-table
:
(defvar *my-table* (make-hash-table))
La funzione può richiedere parametri di parole chiave per specificare ulteriormente il comportamento della tabella hash risultante:
-
test
: seleziona la funzione utilizzata per confrontare le chiavi per l'uguaglianza. Forse un designatore per una delle funzionieq
,eql
,equal
oequalp
. L'impostazione predefinita èeq
. -
size
: un suggerimento all'implementazione dello spazio che potrebbe inizialmente essere richiesto. -
rehash-size
: se un numero intero (> = 1), quando si esegue un rehash, la tabella hash aumenterà la sua capacità in base al numero specificato. Se diversamente è float (> 1.0), la tabella hash aumenterà la sua capacità al prodotto dellarehash-size
e della capacità precedente. -
rehash-threshold
: specifica quanto deve essere piena la tabella hash per attivare un rehash.
Iterating sulle voci di una tabella hash con maphash
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
L'uso di maphash
consente di maphash
le voci di una tabella hash. L'ordine di iterazione non è specificato. Il primo argomento è una funzione che accetta due parametri: la chiave e il valore della voce corrente.
maphash
restituisce sempre NIL
.
Iterating sulle voci di una tabella hash con loop
La macro del ciclo supporta l'iterazione sulle chiavi, i valori o le chiavi e i valori di una tabella hash. I seguenti esempi mostrano le possibilità, ma la sintassi del loop completo consente più combinazioni e varianti.
Oltre chiavi e valori
(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))
Oltre le chiavi
(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)
Oltre i valori
(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)
Iterazione delle voci di una tabella hash con un iteratore di tabella hash
Le chiavi e i valori di una tabella hash possono essere ripetuti usando la macro con-hash-table-iterator . Questo potrebbe essere un po 'più complesso di maphash o loop , ma potrebbe essere usato per implementare i costrutti di iterazione usati in quei metodi. with-hash-table-iterator prende un nome e una tabella hash e lega il nome all'interno di un corpo in modo che le successive chiamate al nome producano più valori: (i) un valore booleano che indica se un valore è presente; (ii) la chiave della voce; e (iii) il valore della voce.
(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)