2013-01-16 27 views
4

我在鸡计划哈希表中有对应于那些键的值键再次与哈希值对应的哈希哈希表。 “内部哈希”的键具有相应的值,即字符串。 (对于熟悉,说,红宝石,设置散列的相关部分可能看起来像如何访问方案中的多维哈希表中的密钥?

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

或读取字符串:

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

,例如)

在在那里我阅读字符串的位置,我需要知道什么group_namesection_name,并且part_name是,我需要能够执行基于每个字符串值某些动作和for-eachmap Scheme的功能似乎不够,因为在任何给定时刻只有三个键/子键字符串中的一个可用。我不知道各个字符串可能保存的模式。网络搜索没有找到可行的解决方案。与此同时,我对Scheme的相对较新,可能不像我应该那么熟悉。任何人都可以将我指向解决方案的方向吗?

回答

2

方案不具有内置的多维散列支持,但与正确的抽象,你可以建立自己的实现:

; 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 

使用以上程序作为起点肯定可以实现所需的功能。还要注意的是鸡计划提供了很多procedures用于处理“正常”的哈希表,其中一些将是有益的,因为这实现使用引擎盖下的普通哈希表。

+0

虽然我很欣赏的答案,因为我不知道组名,SECTION_NAME的什么样的价值观,并part_name时间提前,我看不出这有助于我在呼吁多哈希ref的点就知道它们的值。 –

+1

此外,相信在多哈希ref的拉姆达参数序列应为(H k)和不(K h)中,没有? –

+0

@xuinkrbin。它有帮助,因为您只需将它们作为参数传递:'(multi-hash-ref the_hash group_name section_name part_name)'。在我的Scheme解释器中,foldl中'lambda'的参数是:'(current-element,cumulative-value)',所以它适用于我。如果鸡计划不是这种情况,请倒置它们。 –