Ha

Hashtáblák ebben a kurzusban: Common Lisp

4 feladat

A(z) Hashtáblák fogalomról

A Common Lispben a hashtáblák asszociatív adatok tárolására szolgáló adatszerkezetek. A kulcsokat (amelyek bármilyen objektumok lehetnek) értékekhez (amelyek szintén bármilyen objektumok lehetnek) rendelik.

Hashtáblák létrehozása

Hashtáblákat a make-hash-table függvénnyel hozhatsz létre.

A make-hash-table függvény több kulcsparamétert is fogad, amelyekkel a hashtábla kezdeti méretét és az átméretezési küszöbét hangolhatod finomra; ezekről a teljes leírást a dokumentációban találod. Ennél is fontosabb, hogy fogad egy test kulcsparamétert is, amely meghatározza, hogyan hasonlítódnak össze a kulcsok a kulcsok és értékek beszúrása, keresése és eltávolítása során. A test argumentum értéke 'eq, 'eql, 'equal vagy 'equalp lehet; ezek az általános egyenlőség-predikátumoknak felelnek meg. Az alapértelmezett érték 'eql.

Gyakori műveletek hashtáblákkal

A kulcsához tartozó értéket a gethash függvénnyel kérheted le. A gethash fogad egy [opcionális argumentumot][concept-defualt-arguments], amely azt az értéket adja meg, amelyet a függvény visszaad, ha a kulcs nem szerepel a hashtáblában. A gethash emellett több értéket is visszaad (erről egy másik fogalomnál lesz szó). Az első érték a kulcshoz tartozó érték a hashtáblában, a megadott alapértelmezett érték, vagy NIL. A második érték egy Boolean, amely megmutatja, hogy a kulcs szerepelt-e a hashtáblában vagy sem.

Egy kulcs-érték páros beszúrásához a setf-et használhatod a gethash-sel.

Egy kulcs és a hozzá tartozó érték eltávolításához a remhash-et használd.

Az összes kulcs és érték eltávolításához a clrhash-et használd.

Bár a Common Lispben a hashtábláknak, akárcsak más nyelvekben, nincs garantált sorrendjük, néha hasznos lehet végigiterálni rajtuk, és feldolgozni az egyes kulcs-érték párokat. Erre a maphash használható:

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

(Ez minden kulcsot és értéket cons-párként ír ki, soronként egyet.)

Referencia

(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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Hashtáblák fogalmat

A gyakorlás zárolva

Oldj fel még 3 feladatot, hogy gyakorolhasd a(z) Hashtáblák fogalmat