哈希表,计算重复键,方案
hash-tables, counting duplicate keys, scheme
我希望有人能在我继续寻找解决方案的同时帮助我。
我对如何遍历哈希 table 和查找重复键感到困惑。我想删除重复项,但合并它们的值。
所以,假设我有一个字符串列表:
(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))
然后我将它们存储到散列中 table,其中值是它们在列表中的索引位置。
所以,我想像这样构建一个哈希 table:
(abcde (0, 5))
(bcdea 1)
(cdeab 2)
(deabc 3)
(eabcd 4)
每个字符串都是一个键,值是找到该字符串的索引列表。基本上,我是在计算一个大字符串中某个子字符串出现的次数,并记下它们的位置。
我知道如何制作散列 table:
(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)
这只是构建键及其值的散列 table,它不考虑键是否已存在于 table。
如有任何建议,我将不胜感激。如果有人不介意和我一起逐步完成它,我将不胜感激,我正在努力学习计划。
我正在使用 RSR5。
您在使用 SRFI 69 吗?查看 hash-table-update!
.
诀窍是检查每个键是否已经有一个值,如果有,我们将其附加到列表中——根据定义,每个键只能有 一个 关联的值。我认为您正在寻找这样的东西:
(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)
或者,我们可以使用函数式编程风格创建和更新散列 table:
(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))
我希望有人能在我继续寻找解决方案的同时帮助我。
我对如何遍历哈希 table 和查找重复键感到困惑。我想删除重复项,但合并它们的值。
所以,假设我有一个字符串列表:
(define strings '("abcde" "bcdea" "cdeab" "deabc" "eabcd" "abcde"))
然后我将它们存储到散列中 table,其中值是它们在列表中的索引位置。
所以,我想像这样构建一个哈希 table:
(abcde (0, 5))
(bcdea 1)
(cdeab 2)
(deabc 3)
(eabcd 4)
每个字符串都是一个键,值是找到该字符串的索引列表。基本上,我是在计算一个大字符串中某个子字符串出现的次数,并记下它们的位置。
我知道如何制作散列 table:
(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)
这只是构建键及其值的散列 table,它不考虑键是否已存在于 table。
如有任何建议,我将不胜感激。如果有人不介意和我一起逐步完成它,我将不胜感激,我正在努力学习计划。
我正在使用 RSR5。
您在使用 SRFI 69 吗?查看 hash-table-update!
.
诀窍是检查每个键是否已经有一个值,如果有,我们将其附加到列表中——根据定义,每个键只能有 一个 关联的值。我认为您正在寻找这样的东西:
(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)
或者,我们可以使用函数式编程风格创建和更新散列 table:
(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))