Tracks
/
Common Lisp
Common Lisp
/
Lehrplan
/
Hash-Tabellen
Ha

Hash-Tabellen in Common Lisp

4 Übungen

Über Hash-Tabellen

Hash-Tabellen in Common Lisp sind Datenstrukturen zum Speichern assoziativer Daten. Sie bilden Schlüssel (die beliebige Objekte sein können) auf Werte (die beliebige Objekte sein können) ab.

Hash-Tabellen erstellen

Hash-Tabellen kannst du mit der Funktion make-hash-table erstellen.

Die Funktion make-hash-table akzeptiert mehrere Schlüsselwortparameter, mit denen du die Anfangsgröße der Hash-Tabelle sowie ihre Schwelle für Größenänderungen genau einstellen kannst; vollständige Informationen dazu findest du in der Dokumentation. Noch wichtiger ist, dass es auch einen test-Schlüsselwortparameter akzeptiert, der festlegt, wie Schlüssel beim Einfügen, Nachschlagen und Entfernen von Schlüsseln und Werten verglichen werden. Als Wert für das test-Argument kannst du einen von 'eq, 'eql, 'equal oder 'equalp angeben; diese entsprechen den generischen Gleichheitsprädikaten. Der Standardwert ist 'eql.

Übliche Operationen mit Hash-Tabellen

Um einen Wert über seinen Schlüssel zu erhalten, verwendest du gethash. gethash akzeptiert ein [optionales Argument][concept-defualt-arguments], das als Wert zurückgegeben wird, wenn der Schlüssel nicht in der Hash-Tabelle vorhanden ist. gethash gibt außerdem mehrere Werte zurück (in einem anderen Konzept erklärt). Der erste Wert ist der Wert dieses Schlüssels in der Hash-Tabelle, der Standardwert, falls angegeben, oder NIL. Der zweite Wert ist ein boolescher Wert, der angibt, ob der Schlüssel in der Hash-Tabelle vorhanden war oder nicht.

Um ein Schlüssel-Wert-Paar einzufügen, verwendest du setf zusammen mit gethash.

Um einen Schlüssel und seinen Wert zu entfernen, verwendest du remhash.

Um alle Schlüssel und Werte zu entfernen, verwendest du clrhash

Obwohl eine Hash-Tabelle in Common Lisp, wie in anderen Sprachen, keine garantierte Reihenfolge hat, kann es manchmal nützlich sein, über sie zu iterieren und dabei jedes Schlüssel-Wert-Paar zu verarbeiten. Das kannst du mit maphash machen:

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

(Dies gibt jedes Schlüssel-Wert-Paar als Cons-Paar aus, eines pro Zeile.)

Referenz

(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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Hash-Tabellen

Das Üben ist gesperrt

Schalte 3 weitere Übungen frei, um Hash-Tabellen zu üben