「ハッシュテーブル」の編集履歴(バックアップ)一覧はこちら
「ハッシュテーブル」(2021/04/15 (木) 00:05:47) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
* ハッシュテーブル
** リファレンスマニュアルへのリンク
- [[Hash Tables - GNU Emacs Lisp Reference Manual>http://www.gnu.org/software/emacs/manual/html_node/elisp/Hash-Tables.html]]
** ハッシュを定義する
&italic(){(make-hash-table &rest KEYWORD-ARGS)}
#highlight(lisp) {{
(setq h (make-hash-table :test #'equal)) ;=> #<hash-table 'equal nil 0/65 0xa469420>
; 要素を追加する
(puthash "apple" 150 h) ;=> 150
(puthash "banana" 200 h) ;=> 200
(puthash "lemon" 300 h) ;=> 300
(puthash "fruits" '("apple" . "banana") h) ;=> ("apple" . "banana")
(puthash "animal" '("lion" "monkey" "fish") h) ;=> ("lion" "monkey" "whale") }}
** キーに関連付けられた値を取得する
ハッシュテーブル内部のテスト関数(デフォルトはeql)で比較されます。
指定したキーが存在しない場合の返値も設定可能です。
&italic(){(gethash KEY TABLE &optional DFLT)}
#highlight(lisp) {{
(gethash "apple" h) ;=> 150
(gethash "banana" h) ;=> 200
(gethash "lemon" h) ;=> 300
(gethash "papaia" h) ;=> nil
(gethash "papaia" h 0) ;=> 0
(gethash "fruits" h) ;=> ("apple" . "banana")
(gethash "animal" h) ;=> ("lion" "monkey" "whale") }}
** ハッシュに要素を追加する
&italic(){(puthash KEY VALUE TABLE)}
「ハッシュを定義する」の項目を参照
CLライブラリを使って次の様にも記述できます。
#highlight(lisp) {{
(setf (gethash KEY TABLE) VALUE) }}
** ハッシュ内にキーが存在するかどうか調べる
gethash関数を使って値が返ってくるかで分かります。
ただし指定したキーの要素がnilの場合があるので、正確な値を
得たい場合は別に関数を用意する必要があります。
#highlight(lisp) {{
(defun hash-exists-p (key table)
(let ((novalue (make-symbol "<nil>")))
(not (eq (gethash key table novalue) novalue))))
(hash-exists-p "apple" h) ;=> t
(hash-exists-p "pine" h) ;=> nil }}
** ハッシュの要素数を取得する
&italic(){(hash-table-count TABLE)}
#highlight(lisp) {{
(hash-table-count h) ;=> 3 }}
** キーが存在しない場合のデフォルト値を設定する
** ハッシュからエントリを削除する
&italic(){(remhash KEY TABLE)}
-
-#highlight(lisp) {{
-(hash-table-count h) ;=> 3
-(remhash "apple" h) ;=> nil
-(hash-table-count h) ;=> 2 }}
-
-** ハッシュの全エントリに対してブロックを実行する
-&italic(){(maphash FUNCTION TABLE)}
-
-#highlight(lisp) {{
-(maphash #'(lambda (key value)
- (princ (format "key=>%S,value=>%S\n" key value)))
- h)
-;-> key=>"apple",value=>150
-; key=>"banana",value=>200
-; key=>"lemon",value=>300
-;=> nil }}
-
-** ハッシュを配列に変換する
-
-** ハッシュを空にする
-&italic(){(clrhash TABLE)}
-
-#highlight(lisp) {{
-h ;=> #<hash-table 'equal nil 3/65 0x92a5370>
-(clrhash h) ;=> #<hash-table 'equal nil 0/65 0x92a5370> }}
-
-** ハッシュを値で降順、値が等しい場合キーで昇順にソートする
-** ハッシュの要素をランダムに抽出する
-** 複数のハッシュをマージする
ハッシュテーブル
* リファレンスマニュアルへのリンク
- [[Hash Tables - GNU Emacs Lisp Reference Manual>http://www.gnu.org/software/emacs/manual/html_node/elisp/Hash-Tables.html]]
** ハッシュを定義する
&italic(){(make-hash-table &rest KEYWORD-ARGS)}
#highlight(lisp) {{
(setq h (make-hash-table :test #'equal)) ;=> #<hash-table 'equal nil 0/65 0xa469420>
; 要素を追加する
(puthash "apple" 150 h) ;=> 150
(puthash "banana" 200 h) ;=> 200
(puthash "lemon" 300 h) ;=> 300
(puthash "fruits" '("apple" . "banana") h) ;=> ("apple" . "banana")
(puthash "animal" '("lion" "monkey" "fish") h) ;=> ("lion" "monkey" "whale") }}
* キーに関連付けられた値を取得する
ハッシュテーブル内部のテスト関数(デフォルトはeql)で比較されます。
指定したキーが存在しない場合の返値も設定可能です。
&italic(){(gethash KEY TABLE &optional DFLT)}
#highlight(lisp) {{
(gethash "apple" h) ;=> 150
(gethash "banana" h) ;=> 200
(gethash "lemon" h) ;=> 300
(gethash "papaia" h) ;=> nil
(gethash "papaia" h 0) ;=> 0
(gethash "fruits" h) ;=> ("apple" . "banana")
(gethash "animal" h) ;=> ("lion" "monkey" "whale") }}
* ハッシュに要素を追加する
&italic(){(puthash KEY VALUE TABLE)}
「ハッシュを定義する」の項目を参照
CLライブラリを使って次の様にも記述できます。
#highlight(lisp) {{
(setf (gethash KEY TABLE) VALUE) }}
* ハッシュ内にキーが存在するかどうか調べる
gethash関数を使って値が返ってくるかで分かります。
ただし指定したキーの要素がnilの場合があるので、正確な値を
得たい場合は別に関数を用意する必要があります。
#highlight(lisp) {{
(defun hash-exists-p (key table)
(let ((novalue (make-symbol "<nil>")))
(not (eq (gethash key table novalue) novalue))))
(hash-exists-p "apple" h) ;=> t
(hash-exists-p "pine" h) ;=> nil }}
* ハッシュの要素数を取得する
&italic(){(hash-table-count TABLE)}
#highlight(lisp) {{
(hash-table-count h) ;=> 3 }}
* キーが存在しない場合のデフォルト値を設定する
* ハッシュからエントリを削除する
&italic(){(remhash KEY TABLE)}
#highlight(lisp) {{
(hash-table-count h) ;=> 3
(remhash "apple" h) ;=> nil
(hash-table-count h) ;=> 2 }}
** ハッシュの全エントリに対してブロックを実行する
&italic(){(maphash FUNCTION TABLE)}
#highlight(lisp) {{
(maphash #'(lambda (key value)
(princ (format "key=>%S,value=>%S\n" key value)))
h)
;-> key=>"apple",value=>150
; key=>"banana",value=>200
; key=>"lemon",value=>300
;=> nil }}
** ハッシュを配列に変換する
** ハッシュを空にする
(clrhash TABLE)
#highlight(lisp) {{
(setq h (make-hash-table :test #'equal))
;=> #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ())
(puthash "apple" 150 h)
;=> 150
h
;=> #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ("apple" 150))
(clrhash h)
;=> #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ())
}}
* ハッシュを値で降順、値が等しい場合キーで昇順にソートする
* ハッシュの要素をランダムに抽出する
* 複数のハッシュをマージする