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 funzioni eq , eql , equal o equalp . 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 della rehash-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) 


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow