Ta

Tabelle hash in Common Lisp

4 esercizi

Informazioni su Tabelle hash

Le tabelle hash in Common Lisp sono strutture dati per memorizzare dati associativi. Mappano chiavi (che possono essere qualsiasi oggetto) a valori (che possono essere qualsiasi oggetto).

Creare tabelle hash

Le tabelle hash si possono creare con la funzione make-hash-table.

La funzione make-hash-table accetta diversi parametri keyword per mettere a punto la dimensione iniziale della tabella hash e la sua soglia di ridimensionamento; fai riferimento alla documentazione per tutte le informazioni al riguardo. Ancora più importante, accetta anche un parametro keyword test che definisce come vengono confrontate le chiavi durante l'inserimento, la ricerca e la rimozione di chiavi e valori. I valori dell'argomento test possono essere uno tra 'eq, 'eql, 'equal o 'equalp, che corrispondono ai predicati di uguaglianza generici. Il valore predefinito è 'eql.

Operazioni comuni sulle tabelle hash

Per ottenere un valore dalla sua chiave si usa gethash. gethash accetta un [argomento opzionale][concept-defualt-arguments] che funge da valore da restituire se la chiave non è presente nella tabella hash. gethash restituisce anche valori multipli (spiegati in un altro concetto). Il primo valore è il valore di quella chiave nella tabella hash, il valore predefinito se fornito, oppure NIL. Il secondo valore è un booleano che indica se la chiave era presente o meno nella tabella hash.

Per inserire una coppia chiave-valore si usa setf insieme a gethash.

Per rimuovere una chiave e il suo valore usa remhash.

Per rimuovere tutte le chiavi e i valori usa clrhash

Sebbene una tabella hash in Common Lisp, come in altri linguaggi, non abbia un ordinamento garantito, a volte può essere utile iterare su di essa elaborando ogni coppia chiave/valore. Questo si può fare con maphash:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(Questo stamperà ogni chiave e valore come coppia cons, uno per riga.)

Riferimento

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Tabelle hash

La pratica è bloccata

Sblocca 3 altri esercizi per esercitarti su Tabelle hash