サーチ…


ハッシュテーブルの作成

ハッシュテーブルはmake-hash-tableによって作成されmake-hash-table

(defvar *my-table* (make-hash-table))

この関数は、生成されたハッシュテーブルの振る舞いをさらに指定するキーワードパラメータを取ることができます。

  • test :キーの比較に使用する関数を選択します。関数eqeqlequalまたはequalpいずれかの指定子かもしれませequalp 。デフォルトはeqです。
  • size :最初に必要とされるかもしれない空間についての実装へのヒント。
  • rehash-size :整数(> = 1)の場合、再ハッシュを行うとき、ハッシュテーブルは指定された数だけその容量を増加させます。それ以外の場合はfloat(> 1.0)、ハッシュテーブルはrehash-sizeと以前の容量の積に容量を増やします。
  • rehash-thresholdrehash-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