【问题标题】:Copy Hash Table in Lisp在 Lisp 中复制哈希表
【发布时间】:2014-11-20 15:09:22
【问题描述】:

我最近一直在使用 Common Lisp 中的哈希表。我一直想知道如何制作包含与第一个相同值的哈希表的单独副本。有没有官方的方法可以做到这一点?如果没有,你能给我一个使用 maphash 的例子吗?

【问题讨论】:

  • 我想您可能也对immutable hash table 感兴趣。如果你复制很多,它可能会更有效。
  • 广泛使用的Alexandria库有一个copy-hash-table函数

标签: copy hashtable common-lisp


【解决方案1】:

由于clhs 没有列出复制表函数,我假设 maphash 是要走的路。

(defun copy-table (table)
  (let ((new-table (make-hash-table
                    :test (hash-table-test table)
                    :size (hash-table-size table))))
    (maphash #'(lambda(key value)
                 (setf (gethash key new-table) value))
             table)
    new-table))

(let ((table (make-hash-table)))
  (mapcar #'(lambda(arg argg)
              (setf (gethash arg table) argg))
          '(1 2 3 4) '(a b c d))
  (format t "~a~%" table)
  (format t "~a~%" (copy-table table)))

#<HASH-TABLE :TEST EQL :COUNT 4 {10063C7F13}>
#<HASH-TABLE :TEST EQL :COUNT 4 {10063C86D3}>

然而,这个函数没有考虑哈希表的特殊配置,但作为一个例子就足够了。

【讨论】:

  • 谢谢,做到了,我正在编写康威的人生游戏,我只需要创建一个临时副本,我可以在不影响当前一代的情况下为下一代修改。现在效果很好。
【解决方案2】:

Sim's answer 复制一个哈希表,但哈希表还有两个其他功能可能有助于有效地复制该表。这是一个保留该信息的版本,还展示了 loop 使用哈希表的能力(作为 ma​​phash 的替代品):

(defun copy-hash-table (hash-table)
  (let ((ht (make-hash-table 
             :test (hash-table-test hash-table)
             :rehash-size (hash-table-rehash-size hash-table)
             :rehash-threshold (hash-table-rehash-threshold hash-table)
             :size (hash-table-size hash-table))))
    (loop for key being each hash-key of hash-table
       using (hash-value value)
       do (setf (gethash key ht) value)
       finally (return ht))))
                             

【讨论】:

    【解决方案3】:

    不要重新发明轮子,使用Alexandria中的copy-hash-table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多