Zoeken…


Een hashtabel maken

Hash-tabellen zijn gemaakt door make-hash-table :

(defvar *my-table* (make-hash-table))

De functie kan trefwoordparameters gebruiken om het gedrag van de resulterende hashtabel verder te specificeren:

  • test : selecteert de functie die wordt gebruikt om toetsen te vergelijken voor gelijkheid. Misschien een aanduiding voor een van de functies eq , eql , equal of equalp . De standaardwaarde is eq .
  • size : een tip voor de implementatie over de ruimte die in eerste instantie mogelijk vereist is.
  • rehash-size : als een geheel getal (> = 1), dan verhoogt de hashtabel de capaciteit bij het herhalen met het opgegeven aantal. Als anders een float (> 1.0), dan verhoogt de hashtabel de capaciteit tot het product van de rehash-size en de vorige capaciteit.
  • rehash-threshold : geeft aan hoe vol de hashtabel moet zijn om een re-hash te activeren.

Herhalen van de invoer van een hashtabel met maphash

(defun print-entry (key value)
  (format t "~A => ~A~%" key value))

(maphash #'print-entry *my-table*) ;; => NIL

Met maphash kunt u de items van een hashtabel herhalen. De volgorde van iteratie is niet gespecificeerd. Het eerste argument is een functie die twee parameters accepteert: de sleutel en de waarde van de huidige invoer.

maphash retourneert altijd NIL .

Herhaling van de invoer van een hashtabel met lus

De lusmacro ondersteunt iteratie over de sleutels, de waarden of de sleutels en waarden van een hashtabel. De volgende voorbeelden tonen mogelijkheden, maar de volledige lus- syntaxis biedt meer combinaties en varianten.

Over sleutels en waarden

(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))

Over sleutels

(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)

Over waarden

(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)

De invoer van een hashtabel herhalen met een hashtabel-iterator

De sleutels en waarden van een hashtabel kunnen worden herhaald met behulp van de macro with-hash-table-iterator . Dit kan een beetje ingewikkelder zijn dan maphash of lus , maar het kan worden gebruikt om de iteratieconstructies te implementeren die in die methoden worden gebruikt. with-hash-table-iterator neemt een naam en een hashtabel en bindt de naam binnen een hoofdgedeelte zodat opeenvolgende aanroepen van de naam meerdere waarden produceren: (i) een boolean die aangeeft of een waarde aanwezig is; (ii) de sleutel van de invoer; en (iii) de waarde van de invoer.

(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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow