Lisp-hash-table

提供:Dev Guides
移動先:案内検索

LISP-ハッシュテーブル

ハッシュテーブルのデータ構造は、キーのハッシュコードに基づいて編成された*キーと値*のペアのコレクションを表します。 キーを使用して、コレクション内の要素にアクセスします。

ハッシュテーブルは、キーを使用して要素にアクセスする必要があるときに使用され、有用なキー値を識別できます。 ハッシュテーブルの各アイテムにはキー/値のペアがあります。 キーは、コレクション内のアイテムにアクセスするために使用されます。

LISPでハッシュテーブルを作成する

Common LISPでは、ハッシュテーブルは汎用コレクションです。 任意のオブジェクトをキーまたはインデックスとして使用できます。

ハッシュテーブルに値を格納する場合、キーと値のペアを作成し、そのキーの下に格納します。 後で、同じキーを使用してハッシュテーブルから値を取得できます。 各キーは単一の値にマッピングされますが、新しい値をキーに保存できます。

LISPのハッシュテーブルは、キーの比較方法に基づいて、eq、eql、またはequalの3つのタイプに分類できます。 ハッシュテーブルがLISPオブジェクトでハッシュされる場合、キーはeqまたはeqlと比較されます。 ハッシュテーブルがツリー構造でハッシュする場合、等しいを使用して比較されます。

*make-hash-table* 関数は、ハッシュテーブルの作成に使用されます。 この関数の構文は次のとおりです-
make-hash-table &key :test :size :rehash-size :rehash-threshold

どこ-

  • key 引数はキーを提供します。
  • *:test *引数は、キーの比較方法を決定します-3つの値# 'eq、#' eql、# 'equalのいずれか、または3つのシンボルeq、eql、またはequalのいずれかを持つ必要があります。 指定しない場合は、eqlが想定されます。
  • *:size *引数は、ハッシュテーブルの初期サイズを設定します。 これはゼロより大きい整数でなければなりません。
  • *:rehash-size *引数は、ハッシュテーブルがいっぱいになったときにサイズをどれだけ増やすかを指定します。 これは、追加するエントリの数であるゼロより大きい整数、または古いサイズに対する新しいサイズの比率である1より大きい浮動小数点数にすることができます。 この引数のデフォルト値は実装依存です。
  • *:rehash-threshold *引数は、ハッシュテーブルが成長しなければならない前に、ハッシュテーブルがどれだけいっぱいになるかを指定します。 これは、ゼロより大きく:rehash-sizeより小さい整数(この場合、テーブルが成長するたびにスケーリングされます)か、ゼロと1の間の浮動小数点数です。 この引数のデフォルト値は実装依存です。

引数なしでmake-hash-table関数を呼び出すこともできます。

ハッシュテーブルからのアイテムの取得とハッシュテーブルへのアイテムの追加

*gethash* 関数は、キーを検索してハッシュテーブルからアイテムを取得します。 キーが見つからない場合は、nilを返します。

次の構文があります-

gethash key hash-table &optional default

ここで-

  • key:関連するキーです

  • ハッシュテーブル:検索するハッシュテーブルです

  • デフォルト:エントリが見つからない場合に返される値、指定されていない場合はnil

    *gethash* 関数は実際には2つの値を返します。2番目の値は、エントリが見つかった場合はtrue、エントリが見つからなかった場合はfalseの述語値です。

ハッシュテーブルにアイテムを追加するには、 setf 関数と gethash 関数を使用できます。

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

(setq empList (make-hash-table))
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal))
(write (gethash '001 empList))
(terpri)
(write (gethash '002 empList))

あなたがコードを実行すると、それは次の結果を返します-

(CHARLIE BROWN)
(FREDDIE SEAL)

エントリーの削除

*remhash* 関数は、ハッシュテーブル内の特定のキーのエントリを削除します。 これは、エントリが存在する場合はtrue、存在しない場合はfalseとなる述語です。

この関数の構文は次のとおりです-

remhash key hash-table

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

(setq empList (make-hash-table))
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal))
(setf (gethash '003 empList) '(Mark Mongoose))

(write (gethash '001 empList))
(terpri)
(write (gethash '002 empList))
(terpri)
(write (gethash '003 empList))
(remhash '003 empList)
(terpri)
(write (gethash '003 empList))

あなたがコードを実行すると、それは次の結果を返します-

(CHARLIE BROWN)
(FREDDIE SEAL)
(MARK MONGOOSE)
NIL

maphash関数

*maphash* 関数を使用すると、ハッシュテーブルの各キーと値のペアに指定された関数を適用できます。

関数とハッシュテーブルの2つの引数を取り、ハッシュテーブル内のキー/値のペアごとに1回関数を呼び出します。

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

(setq empList (make-hash-table))
(setf (gethash '001 empList) '(Charlie Brown))
(setf (gethash '002 empList) '(Freddie Seal))
(setf (gethash '003 empList) '(Mark Mongoose))

(maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) empList)

あなたがコードを実行すると、それは次の結果を返します-

3 => (MARK MONGOOSE)
2 => (FREDDIE SEAL)
1 => (CHARLIE BROWN)