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,equallubequalp. 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-sizei 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)