Hash 哈希表、重复键计数、方案

Hash 哈希表、重复键计数、方案,hash,scheme,Hash,Scheme,我希望在我继续寻找解决方案的同时,有人能帮我解决这个问题 我对如何遍历哈希表并找到重复的键感到困惑。我想删除重复项,但合并它们的值 假设我有一个字符串列表: (define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde")) 我将它们存储到一个哈希表中,其中的值是它们在列表中的索引位置 所以,我想建立一个如下的哈希表: (abcde (0, 5)) (bcdea 1) (cdeab 2) (deabc 3) (eabcd 4)

我希望在我继续寻找解决方案的同时,有人能帮我解决这个问题

我对如何遍历哈希表并找到重复的键感到困惑。我想删除重复项,但合并它们的值

假设我有一个字符串列表:

(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))
我将它们存储到一个哈希表中,其中的值是它们在列表中的索引位置

所以,我想建立一个如下的哈希表:

(abcde (0, 5))
(bcdea 1)
(cdeab 2)
(deabc 3)
(eabcd 4)
(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))
(define values  '(0 1 2 3 4 5))

(define my-hash-table (make-hash))
(for-each (lambda (s v)
            (hash-update! my-hash-table
                          s
                          (lambda (a) (cons v a)) ; add element to list
                          (lambda () '())))       ; we start with '()
          strings
          values)
每个字符串都是一个键,值是找到该字符串的索引列表。基本上,我计算一个大字符串中子字符串的出现次数,并记录它们的位置

我知道如何制作哈希表:

(define my-hash-table (make-hash))
  (for-each (lambda (s v) (hash-set! my-hash-table s v)) strings values)  ;;values is a list of 0,1,2,3,4,5
  (map (lambda (s) (list s (hash-ref my-hash-table s))) strings)

这只是建立了一个哈希表的键值和它们的值,它不考虑一个键是否已经存在于表中。< /P> 如果有任何建议,我将不胜感激。如果有人不介意和我一步一步地经历,我会非常感激,我正在努力学习这个计划


我用的是RSR5

你在用什么?查看
哈希表更新

诀窍是检查每个键是否已经有一个值,如果已经有,我们将其附加到列表中-根据定义,每个键只能有一个关联的值。我想你在找这样的东西:

(abcde (0, 5))
(bcdea 1)
(cdeab 2)
(deabc 3)
(eabcd 4)
(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))
(define values  '(0 1 2 3 4 5))

(define my-hash-table (make-hash))
(for-each (lambda (s v)
            (hash-update! my-hash-table
                          s
                          (lambda (a) (cons v a)) ; add element to list
                          (lambda () '())))       ; we start with '()
          strings
          values)
或者,我们可以使用函数式编程创建和更新哈希表:

(define my-hash-table
  (foldl (lambda (s v a)
           (hash-update a
                        s
                        (lambda (a) (cons v a)) ; add element to list
                        (lambda () '())))       ; we start with '()
         (hash)
         strings
         values))
无论哪种方式,它都能按预期工作:

(hash->list my-hash-table) ; we get a keys/values list for free
=> '(("eabcd" 4) ("deabc" 3) ("bcdea" 1) ("cdeab" 2) ("abcde" 5 0))