Haskell新手求助:实现字符串字符计数的元组列表生成函数
解决Haskell字符串字符计数问题
要实现字符计数并合并重复项,直接用Data.List模块的sort和group函数就能搞定,这是最简洁的方案:
import Data.List (sort, group) charCountTup :: [Char] -> [(Char, Integer)] charCountTup xs = map countGroup $ group $ sort xs where countGroup g = (head g, toInteger $ length g)
代码逻辑拆解:
sort xs:先对字符串按ASCII顺序排序,让相同字符相邻排列(比如输入"Hello"排序后会变成"He llo",两个l会挨在一起)。group:把相邻的相同字符打包成子列表,排序后的"Hello"会被处理成["H", "e", "ll", "o"]。map countGroup:遍历每个分组,取分组的第一个元素作为要统计的字符,再用length获取分组长度(也就是该字符的出现次数),转成Integer后和字符组成目标元组。
测试输入"Hello",返回结果正好是你期望的:[('H',1),('e',1),('l',2),('o',1)]
原代码的问题:
你之前的代码只是用map把每个字符单独映射成(字符, 1),完全没处理重复字符的合并,所以每个字符都会生成独立元组,自然不会累加计数。
如果不想依赖标准库,也可以自己手写归组逻辑,但对新手来说,用现成的库函数效率最高,也最不容易出错。
内容的提问来源于stack exchange,提问作者shreyy.dev
相关产品推荐
相关产品推荐

