我在Chicken Scheme中有一个哈希表,哈希表中的键具有与这些键相对应的值,这些键是具有相应哈希值的哈希值。 “内部哈希”的键具有对应的值,即字符串。 (对于那些熟悉Ruby的人来说,设置哈希的相关部分可能看起来像
the_hash[group_name][section_name][part_name] = some_text
或阅读字符串:
a_string = the_hash[group_name][section_name][part_name]
例如,。)
在我阅读字符串时,我需要知道group_name
,section_name
和part_name
是什么,我需要能够根据每个字符串的值以及Scheme的for-each
和map
特征似乎都不够,因为在任何给定时刻,三个键/子键字符串中只有一个似乎可用。我不知道各个字符串可能包含哪些模式。网络搜索没有找到可行的解决方案。与此同时,我对Scheme相对较新,可能并不像我应该那么熟悉。任何人都能指出我的解决方案吗?
答案 0 :(得分:2)
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,其中一些会很有用,因为这个实现使用了普通的哈希表。