【问题标题】:how to access the keys in a multidimensional hash table in scheme?如何访问方案中多维哈希表中的键?
【发布时间】:2012-12-30 06:30:30
【问题描述】:

我在 Chicken Scheme 中有一个哈希表,哈希表的键值对应于这些键值,而这些键值又是对应的哈希值。 “内部哈希”的键具有相应的字符串值。 (对于那些熟悉 Ruby 的人来说,设置哈希的相关部分可能看起来像

the_hash[group_name][section_name][part_name] = some_text

或读取字符串:

a_string = the_hash[group_name][section_name][part_name]

,例如。)

在读取字符串时,我需要知道group_namesection_namepart_name 是什么,并且我需要能够根据每个字符串的值执行某些操作Scheme 的 for-eachmap 功能似乎还不够,因为在任何给定时刻似乎只有三个键/子键字符串中的一个可用。我不知道各个字符串可能包含什么模式。网络搜索没有找到可行的解决方案。同时,我对 Scheme 比较陌生,可能没有我应该熟悉的程度。任何人都可以指出解决方案的方向吗?

【问题讨论】:

    标签: scheme hashtable chicken-scheme


    【解决方案1】:

    Scheme 没有对多维哈希的内置支持,但通过正确的抽象,您可以构建自己的实现:

    ; create a new multidimensional hash table
    (define (make-multi-hash)
      (make-hash-table))
    
    ; set a value given a non-empty sequence of keys
    (define (multi-hash-set! hash-table value . keys)
      (let loop ((hash hash-table)
                 (keys keys))
        (cond ((null? (cdr keys))
               (hash-table-set! hash (car keys) value))
              (else
               (if (not (hash-table-exists? hash (car keys)))
                 (hash-table-set! hash (car keys) (make-multi-hash)))
               (loop (hash-table-ref hash (car keys)) (cdr keys))))))
    
    ; retrieve a value given a non-empty sequence of keys
    (define (multi-hash-ref hash-table . keys)
      (foldl (lambda (k h) (hash-table-ref h k))
             hash-table
             keys))
    

    像这样使用它:

    (define h (make-multi-hash))
    (multi-hash-set! h 42 'a 'b 'c)
    (multi-hash-ref h 'a 'b 'c)
    => 42
    

    使用上述过程作为起点,您肯定可以实现所需的功能。另请注意,Chicken Scheme 提供了很多 procedures 用于处理“普通”哈希表,其中一些会很有用,因为此实现在后台使用普通哈希表。

    【讨论】:

    • 虽然我很欣赏这个答案,因为我不知道 group_name、section_name 和 part_name 的值是什么提前,我不明白这如何帮助我在调用 multi 时了解它们的值-hash-ref.
    • 另外,我认为multi-hash-ref的lambda中的参数序列应该是(h k)而不是(k h),不是吗?
    • @xuinkrbin。这很有帮助,因为您只需将它们作为参数传递:(multi-hash-ref the_hash group_name section_name part_name)。在我的 Scheme 解释器中,foldllambda 的参数是:(current-element, accumulated-value),所以它适用于我。如果鸡计划中不是这种情况,请将它们反转。
    • 好的,我想我总是可以在每组键上使用一个while循环来帮助填补任何空白。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2013-03-22
    • 2020-07-07
    • 2021-12-10
    • 2016-09-15
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多