我有一个类似的字符串
test = "fDfDfadsptupauOasufDfDfadsptupausapasdfogfdifdsudsaufuffxDfDfDfDfDfDfadsptupauOasufDfDfadsptupausap"
我希望得到例如char' 0'的出现次数。关于' 0'之后的字符。 ,例如,当我调用我的函数时,它应该给出
的字符串测试 ('0',[(8,'w'),(2,'q')])
这意味着char' 0'以#34; 0w"形式发生8次和#34; 2q"
形式的2次直到现在我仍然对“' 0'这是10,但我无法得到它的邻居,我的代码
freq c l = filter (==c) l
function::[(Char ,Int)]
function = [('0' , sum (map length (map (freq '0') test)))]
请注意我的输出应为
类型function :: [(Char,[(Int,Char)])
答案 0 :(得分:4)
考虑如何将数据转换为String
,使其成为可以处理的结果,以便为您提供所需的结果。你真正感兴趣的是成对的相邻字符,所以你的第一步是编写一个函数,将每个元素与其后继元素配对:
matchSuccessors :: String -> [(Char, Char)]
matchSuccessors text = undefined
然后,您希望将第一个元素组合在一起,例如'0'
。为此,您需要查看sort/sortBy
中的group/groupBy
和Data.List
:
organizeSuccessors :: [(Char, Char)] -> [[(Char, Char)]]
organizeSuccessors succs = undefined
此时你应该有类似
的东西> organizeSuccessors (matchSuccessors "abababacacabac")
[[('a','b'),('a','b'),('a','b'),('a','b')],
[('a','c'),('a','c'),('a','c')],
[('b','a'),('b','a'),('b','a'),('b','a')],
[('c','a'),('c','a')]
]
(为了便于阅读而添加了空格)
现在,您可以非常轻松地测量每个长度,并将其与哪个元素配对:
countSuccessorGroups :: [[(Char, Char)]] -> [((Char, Char), Int)]
countSuccessorGroups grps = map (\grp -> (head grp, length grp)) grps
现在你会看到
> countSuccessorGroups $ organizeSuccessors $ matchSuccessors "abababacacabac"
[(('a', 'b'), 4),
(('a', 'c'), 3),
(('b', 'a'), 4),
(('c', 'a'), 2)
]
现在,凭借您对sortBy
和groupBy
的了解,您应该能够将其转换为您需要的内容:
organizeByFirstLetter :: [((Char, Char), Int)] -> [(Char, [(Int, Char)])]
organizeByFirstLetter succgrps = undefined
所以你的整个计划将是
function
= organizeByFirstLetter
$ countSuccessorGroups
$ organizeSuccessors
$ matchSuccessors
$ test
您还可以根据需要将organizeByFirstLetter
分解为多个步骤。