【问题标题】:hashtable keys that are strings not recognized无法识别为字符串的哈希表键
【发布时间】:2013-02-22 21:41:43
【问题描述】:

Scheme 的 eqv-hashtable 数据结构似乎无法识别字符串键。在以下代码中,我创建了一个 eqv-hashtable 并创建了一个新数据:

(define state-hash (make-eqv-hashtable))
(hashtable-set! state-hash "S" (State "S" #f '() '()))

但是,当我尝试检查我的数据是否存储在哈希表中时,我遇到了以下情况:

(hashtable-contains? state-hash "S")  ; --> #f

虽然hashtable-contains? 过程显示密钥"S" 当前不在哈希表中,但以下建议并非如此:

(hashtable-keys state-hash)   ; --> #("S")

如果我使用非字符串作为键,例如符号(例如'S),我没有任何问题。任何想法为什么它不喜欢字符串作为键?

【问题讨论】:

    标签: scheme key hashtable


    【解决方案1】:

    eqv? 仅在其参数引用完全相同的对象时才返回#t。试试这个:

    (define key "S")
    (define state-hash (make-eqv-hashtable))
    (hashtable-set! state-hash key (State "S" #f '() '()))
    (hashtable-contains? state-hash key)
    

    【讨论】:

    • 啊,当然。我忘记了 eqv? 谓词。现在这是有道理的。另一种选择可能是使用(make-hashtable),我认为它允许传递不同的谓词。在这种情况下,我不想针对eqv? 而是针对equal? 进行测试。所以也许这就是要走的路。
    • @Dylan 是的,如果你不需要对象 equivalence 键更好地坚持 equality,它会让事情变得更简单。干杯!
    【解决方案2】:

    你试过make-equal-hashtable吗?我对这些没有太多经验,但我知道

    (define str "S")
    (eqv? str "S") => #f
    (equal? str "S") => #t
    

    http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Equivalence-Predicates.html#Equivalence-Predicates

    编辑:Oscar 有一个很好的解决方案

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 2013-05-02
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2013-05-01
      • 2013-12-19
      相关资源
      最近更新 更多