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 funkcji eq , eql , equal lub equalp . Wartość domyślna to eq .
  • 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ści rehash-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) 


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow