common-lisp
ハッシュテーブル
サーチ…
ハッシュテーブルの作成
ハッシュテーブルはmake-hash-table
によって作成されmake-hash-table
:
(defvar *my-table* (make-hash-table))
この関数は、生成されたハッシュテーブルの振る舞いをさらに指定するキーワードパラメータを取ることができます。
-
test
:キーの比較に使用する関数を選択します。関数eq
、eql
、equal
またはequalp
いずれかの指定子かもしれませequalp
。デフォルトはeq
です。 -
size
:最初に必要とされるかもしれない空間についての実装へのヒント。 -
rehash-size
:整数(> = 1)の場合、再ハッシュを行うとき、ハッシュテーブルは指定された数だけその容量を増加させます。それ以外の場合はfloat(> 1.0)、ハッシュテーブルはrehash-size
と以前の容量の積に容量を増やします。 -
rehash-threshold
:rehash-threshold
ハッシュをトリガーするためにハッシュテーブルがどのくらい必要であるかを指定します。
ハッシュテーブルのエントリを括弧でくくってみる
(defun print-entry (key value)
(format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
maphash
使用すると、ハッシュテーブルのエントリを反復maphash
できます。反復の順序は不明です。最初の引数は、現在のエントリのキーと値の2つのパラメータを受け入れる関数です。
maphash
常にNIL
を返します。
ハッシュテーブルのエントリをループで反復する
ループマクロは、キー、値、またはハッシュテーブルのキーと値に対する反復をサポートします。次の例は可能性を示していますが、完全なループ構文ではより多くの組み合わせとバリアントが可能です。
キーと値のオーバー
(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))
キーオーバー
(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)
値超過
(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)
ハッシュテーブルのイテレータを使ってハッシュテーブルのエントリを反復処理する
ハッシュテーブルのキーと値は、マクロwith-hash-table-iteratorを使用して反復することができます 。これは、 maphashやループよりも少し複雑かもしれませんが、それらのメソッドで使用される反復構造を実装するために使用できます。 with-hash-table-iteratorは、名前とハッシュテーブルをとり、名前への連続する呼び出しが複数の値を生成するように、本体内の名前をバインドします:(i)値が存在するかどうかを示すブール値。 (ii)エントリーの鍵。 (iii)エントリーの価値。
(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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow