【问题标题】:hash-tables, counting duplicate keys, scheme哈希表,计算重复键,方案
【发布时间】:2016-02-24 23:18:15
【问题描述】:

在我继续寻找解决方案的同时,我希望有人可以帮助我。

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

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

(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))

我将它们存储到一个哈希表中,其中的值是它们在列表中的索引位置。

所以,我想建立一个这样的哈希表:

(abcde (0, 5))
(bcdea 1)
(cdeab 2)
(deabc 3)
(eabcd 4)

每个字符串都是一个键,值是找到该字符串的索引列表。基本上,我正在计算一个大字符串中子字符串的出现次数,并注意它们的位置。

我知道如何制作哈希表:

(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)

这只是建立一个键及其值的哈希表,它不考虑表中是否已经存在键。

如果有任何建议,我将不胜感激。如果有人不介意与我一起逐步完成它,我将非常感激,我正在努力学习计划。

我正在使用 RSR5。

【问题讨论】:

    标签: hash scheme


    【解决方案1】:

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

    (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))
    

    【讨论】:

      【解决方案2】:

      你在使用SRFI 69吗?查看hash-table-update!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-06
        • 2016-02-22
        • 1970-01-01
        • 2016-04-29
        • 2016-06-23
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多