common-lisp
Mesas de hash
Buscar..
Creando una tabla hash
Las tablas hash son creadas por make-hash-table
:
(defvar *my-table* (make-hash-table))
La función puede tomar parámetros de palabras clave para especificar aún más el comportamiento de la tabla hash resultante:
-
test
: selecciona la función que se usa para comparar claves para la igualdad. Tal vez un designador para una de las funcioneseq
,eql
,equal
oequalp
. El valor predeterminado eseq
. -
size
: una sugerencia para la implementación sobre el espacio que puede requerirse inicialmente. -
rehash-size
: si es un número entero (> = 1), al hacer un rehash, la tabla hash aumentará su capacidad en el número especificado. De lo contrario, un flotador (> 1.0), entonces la tabla hash aumentará su capacidad al producto delrehash-size
y la capacidad anterior. -
rehash-threshold
: especifica qué tan completa debe estar la tabla hash para activar un rehash.
Iterando sobre las entradas de una tabla hash con maphash
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
El uso de maphash
permite iterar sobre las entradas de una tabla hash. El orden de iteración no está especificado. El primer argumento es una función que acepta dos parámetros: la clave y el valor de la entrada actual.
maphash
siempre devuelve NIL
.
Iterando sobre las entradas de una tabla hash con bucle
La macro de bucle admite la iteración sobre las claves, los valores o las claves y valores de una tabla hash. Los siguientes ejemplos muestran posibilidades, pero la sintaxis de bucle completo permite más combinaciones y variantes.
Sobre llaves y valores.
(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))
Sobre llaves
(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)
Sobre valores
(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)
Iterando sobre las entradas de una tabla hash con un iterador de tabla hash
Las claves y los valores de una tabla hash pueden repetirse utilizando la macro with-hash-table-iterator . Esto puede ser un poco más complejo que el maphash o el bucle , pero podría usarse para implementar las construcciones de iteración utilizadas en esos métodos. with-hash-table-iterator toma un nombre y una tabla hash y vincula el nombre dentro de un cuerpo de modo que las sucesivas llamadas al nombre produzcan múltiples valores: (i) un valor booleano que indica si un valor está presente; (ii) la clave de la entrada; y (iii) el valor de la entrada.
(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)