如何映射哈希表(球拍)的值

时间:2013-01-31 18:04:52

标签: scheme hashtable racket

我想将函数映射到散列表中的值,如下所示:

(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))

是否有库函数来执行此操作?有一个人也可以使用不可变的hashetables。

我看着PlaneT,但没有看到任何东西。

现在,如果这确实不存在,我会继续写下来。把这个变成球拍的礼节是什么?我只是将它分叉在github上并将其添加到标准库(和文档!)并提交拉取请求?或者我应该先把它作为一个飞机,然后要求它被移入?我想帮忙,但我不知道什么是'正确'的方式去做。

4 个答案:

答案 0 :(得分:6)

有一个哈希映射,但它返回一个列表[1]

您必须自己编写hash-map才能完全按照自己的意愿行事。

#lang racket

(define (new-hash-map f h)
  (make-immutable-hash (hash-map h (λ (k v) (cons k (f v))))))

(new-hash-map add1 (hash "apple" 1 "pear" 2))

; => '#hash(("pear" . 3) ("apple" . 2))

您可能感兴趣的另一种形式是/ hash [2]:

#lang racket

(define (new-hash-map2 f h)
  (for/hash ([(k v) (in-hash h)]) (values k (f v))))

(new-hash-map2 add1 (hash "apple" 1 "pear" 2))

; => '#hash(("pear" . 3) ("apple" . 2))

如果您觉得这个功能应该包含在Racket中,那么非常欢迎补丁!贡献的最佳方式是在github上分叉并提交拉取请求。

答案 1 :(得分:2)

在Racket中,您可以使用hash-map更高阶的过程,该过程通常会返回一个列表,其中包含作为参数接收的过程的应用所产生的值,但它可以适用于就地修改地图。例如:

(define h (make-hash))
(hash-set! h "apple" 1)
(hash-set! h "pear" 2)

h
=> '#hash(("pear" . 2) ("apple" . 1))

诀窍是传递具有适当功能的lambda

(hash-map h (lambda (key value)
              (let ((newval (add1 value)))
                (hash-set! h key newval)
                newval)))

h
=> '#hash(("pear" . 3) ("apple" . 2))

要获得更通用的解决方案,请尝试以下实现:

(define (mutable-hash-map! hash proc)
  (hash-map hash (lambda (key value)
                   (hash-set! hash key (proc value))))
  (void))

答案 2 :(得分:1)

您可以使用in-hash-values迭代哈希表的值,并使用常规for loops来映射它们。函数in-hash-values接受一个哈希并返回一个值序列,然后可以使用for循环遍历这些值。

示例:

(for/list ([elt (in-hash-values (hash "apple" 1 "pear" 2))])
  (add1 elt))

同样,你可以使用sequence-map,虽然你得到的是另一个序列而不是列表:

(sequence-map add1 (in-hash-values (hash "apple" 1 "pear" 2)))

答案 3 :(得分:1)

由于 hash-map 会创建一个此处不需要的列表,我宁愿使用 hash-for-each

(define (hash-update-all! h func)
  (hash-for-each
    h
    (lambda (k v) (hash-set! h k (func v)))))

(define table (make-hash '((a . 1) (b . 2) (c . 3))))

(hash-update-all! table (curry * 100))

table

 ==> '#hash((c . 300) (a . 100) (b . 200))

编辑:我忘了 for 可以处理哈希表:

(define (hash-update-all! h func)
  (for ([(k v) h])   (hash-set! h k (func v))))

(hash-update-all! table (curryr / 10))

table

 ==> '#hash((c . 30) (a . 10) (b . 20))