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 Funktionen eq , eql , equal oder equalp . Der Standardwert ist eq .
  • 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 der rehash-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) 


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow