我如何计算字符串中字符的频率,然后将它们输出到一个表中?
例如,如果我输入单词"happy“,结果将是
h 1
a 1
p 2
y 1
如果这也可以按ASCII顺序订购,那就太棒了。
我知道我需要使用count函数,任何其他提示都将不胜感激。
编辑:所有的答案都很精彩,只是我在Haskell还是个初学者,实际上我不知道他们在做什么。
发布于 2011-08-18 22:02:36
最简单的解决方案是使用Data.Map
来存储从字符到频率的中间映射。然后,您可以使用fromListWith
轻松地构造计数。由于Data.Map
是经过排序的,因此您可以免费获得按ASCII码排序的它们。
λ> :m + Data.Map
λ> let input = "happy"
λ> toList $ fromListWith (+) [(c, 1) | c <- input]
[('a',1),('h',1),('p',2),('y',1)]
那么这里发生了什么呢?
其思想是使用字符作为关键字,使用频率作为值来构建Data.Map
(树形映射)。
首先,我们获取输入字符串,并使用1
为每个字符创建元组,以指示一个匹配项。
λ> [(c, 1) | c <- input]
[('h',1),('a',1),('p',1),('p',1),('y',1)]
接下来,我们使用fromListWith
通过重复地将每个键-值对插入到映射中来从这些键-值对构建排序映射。我们还为它提供了一个函数,当一个键已经存在于映射中时将使用该函数。在我们的例子中,我们使用(+)
,这样当一个字符多次出现时,我们将计数与现有的和相加。
最后,我们使用toList
将映射转换回一个键-值元组列表。
发布于 2011-08-18 22:02:24
可能有一些更短的东西,但这是有效的:
Prelude> import Data.List
Prelude Data.List> map (\x -> (head x, length x)) $ group $ sort "happy"
[('h',1),('a',1),('p',2),('y',1)]
发布于 2011-08-18 22:06:04
func xs = map (\a -> (head a, length a)) $ group $ sort xs
https://stackoverflow.com/questions/7108559
复制相似问题