common-lisp
Tabele skrótów
Szukaj…
Tworzenie tabeli skrótów
Tabele make-hash-table
są tworzone przez make-hash-table
:
(defvar *my-table* (make-hash-table))
Funkcja może przyjmować parametry słów kluczowych w celu dalszego określenia zachowania wynikowej tabeli skrótów:
-
test
: Wybiera funkcję używaną do porównywania kluczy równości. Może desygnator jednej z funkcjieq
,eql
,equal
lubequalp
. Wartość domyślna toeq
. -
size
: wskazówka dotycząca implementacji dotycząca miejsca, które może być początkowo wymagane. -
rehash-size
: Jeśli liczba całkowita (> = 1), to podczas wykonywania powtórki tabela skrótów zwiększy swoją pojemność o określoną liczbę. Jeśli inaczej jest liczbą zmiennoprzecinkową (> 1,0), to tablica skrótów zwiększy swoją pojemność do iloczynu wielkościrehash-size
i poprzedniej pojemności. -
rehash-threshold
: określa, jak pełna musi być tabela haszowania, aby uruchomić rehash.
Iterowanie po wpisach tabeli mieszającej za pomocą maphash
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
Użycie maphash
pozwala na iterację wpisów tablicy haszującej. Kolejność iteracji nie jest określona. Pierwszy argument to funkcja akceptująca dwa parametry: klucz i wartość bieżącego wpisu.
maphash
zawsze zwraca NIL
.
Iterowanie po wpisach tabeli mieszającej z pętlą
Makro pętli obsługuje iterację kluczy, wartości lub kluczy i wartości tabeli skrótów. Poniższe przykłady pokazują możliwości, ale pełna składnia pętli pozwala na więcej kombinacji i wariantów.
Ponad klucze i wartości
(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))
Ponad klucze
(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)
Ponad wartości
(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)
Iterowanie po wpisach tabeli skrótu za pomocą iteratora tablicy skrótów
Klucze i wartości tabeli skrótów można iterować za pomocą makra with-hash-table-iterator . Może to być nieco bardziej skomplikowane niż maphash lub pętla , ale może być wykorzystane do implementacji konstrukcji iteracyjnych używanych w tych metodach. iterator with-hash-table-iter pobiera nazwę i tablicę skrótów i wiąże nazwę w ciele, tak że kolejne wywołania nazwy generują wiele wartości: (i) wartość logiczna wskazująca, czy wartość jest obecna; (ii) klucz wpisu; oraz (iii) wartość pozycji.
(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)