common-lisp
Hash-Tabellen
Suche…
Erstellen einer Hashtabelle
Hash-Tabellen werden von make-hash-table
:
(defvar *my-table* (make-hash-table))
Die Funktion kann Schlüsselwortparameter verwenden, um das Verhalten der resultierenden Hashtabelle näher zu bestimmen:
-
test
: Wählt die Funktion aus, die zum Vergleichen von Tasten auf Gleichheit verwendet wird. Vielleicht ein Bezeichner für eine der Funktioneneq
,eql
,equal
oderequalp
. Der Standardwert isteq
. -
size
: Ein Hinweis auf die Implementierung des anfänglich erforderlichen Speicherplatzes. -
rehash-size
: Bei einer Ganzzahl (> = 1) erhöht die Hashtabelle beim Aufräumen die Kapazität um die angegebene Anzahl. Wenn ansonsten ein Float (> 1.0), erhöht die Hashtabelle ihre Kapazität auf das Produkt derrehash-size
und der vorherigen Kapazität. -
rehash-threshold
: Gibt an, wie voll die Hashtabelle sein muss, um eine Rehash auszulösen.
Iteration über die Einträge einer Hashtabelle mit maphash
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
Mit maphash
können Sie die Einträge einer Hash-Tabelle maphash
. Die Reihenfolge der Iteration ist nicht spezifiziert. Das erste Argument ist eine Funktion, die zwei Parameter akzeptiert: den Schlüssel und den Wert des aktuellen Eintrags.
maphash
immer NIL
.
Iteration über die Einträge einer Hashtabelle mit Schleife
Das Schleifenmakro unterstützt die Iteration über die Schlüssel, die Werte oder die Schlüssel und Werte einer Hashtabelle. Die folgenden Beispiele zeigen Möglichkeiten, aber die vollständige Schleifensyntax ermöglicht mehr Kombinationen und Varianten.
Über Tasten und Werte
(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))
Über Schlüssel
(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)
Über werte
(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)
Iteration über die Einträge einer Hashtabelle mit einem Hashtabelleniterator
Die Schlüssel und Werte einer Hashtabelle können mit Hilfe des Makros with-hash-table-iterator durchlaufen werden . Dies ist möglicherweise etwas komplexer als Maphash oder Loop , aber es kann verwendet werden, um die in diesen Methoden verwendeten Iterationskonstrukte zu implementieren. with-hash-table-iterator verwendet einen Namen und eine Hash-Tabelle und bindet den Namen in einem Body so, dass aufeinanderfolgende Aufrufe des Namens mehrere Werte erzeugen: (i) ein boolescher Wert, der angibt, ob ein Wert vorhanden ist; (ii) den Schlüssel des Eintrags; und (iii) den Wert des Eintrags.
(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)