在elixir中分组或统计重复的字母

时间:2016-04-03 23:55:29

标签: elixir

我正在尝试计算Elixir中字符串上的重复字母。 我确实尝试了一些尝试,但直到现在都没有成功。

我们以此字符串为例:"AAABBAAC"

所需的输出为"3A2B2A1C"

将此字符串转换为List,我能够计算每个字母,结果为"5A2B1C",但我必须按照顺序计算。

这是我正在做的代码:

string
|> String.graphemes
|> Enum.reduce([], fn(letter, acc) -> Keyword.update(acc, letter, 1, &(&1 + 1)) end)

但是,在我的测试中,我正在尝试生成一个List,就像这个["AAA", "BB", "AA", "C"]一样,所以我可以用String.lenght轻松计算。

有没有办法产生这个?

提前致谢。

更新

看起来像使用Enum.chunk_by我正在接近解决方案。

更新2:

有人可以告诉我为什么这个问题被标记为-1?正如你所看到的,我对StackOverflow很新,所以我想以正确的方式做到这一点。

更新3:

在主要问题中添加了一些代码,遵循社区中的最佳做法,以避免混淆和关闭主题的投票。无论如何,这个问题已经解决了。

3 个答案:

答案 0 :(得分:6)

如果使用递归方法实现此操作,则可以轻松跟踪最后发生的字符及其当前计数,以及到目前为止保存结果的累加器。如果当前字符等于最后一个字符,则只需增加计数。如果两者不同,则将最后一个字符及其计数添加到累加器,然后继续下一个字符,直到字符串为空。最后,编码最终值并返回结果。

UPDATE eest_estimated_total 
SET pet.Freight = pt.FrieghtCost, pet.CustomDuty = pt.ImportDuty 
FROM eest_estimated_total pet 
INNER JOIN eest_total pt 
ON pt.OrderNo = pet.OrderNo 
WHERE pt.OrderNo = pet.OrderNo

答案 1 :(得分:3)

根据Help Center > Answering,我确实解决了这个问题:

string
|> String.graphemes
|> Enum.chunk_by(fn arg -> arg end)
|> Enum.map(fn arg -> to_string(arg) end)
|> Enum.reduce("", fn(arg, acc) -> acc <> to_string(String.length(arg)) <> String.first(arg) end)

现在,解释:

String.graphemesstring变为List,分别包含每个字母:

["A", "A", "A", "B", "B", "A", "A", "C"]

Enum.chunk_by(fn arg -> arg end)将每个重复的字母分组到新列表中:

[["A", "A", "A"], ["B", "B"], ["A", "A"], ["C"]]

Enum.map(fn arg -> to_string(arg) end)再次聚集在一起:

["AAA", "BB", "AA", "C"]

Enum.reduce("", fn(arg, acc) -> acc <> to_string(String.length(arg)) <> String.first(arg) end)最终将计数(String.length)和第一个字母(String.first)连接到initiall accumulator(""):

"3A2B2A1C"

答案 2 :(得分:0)

您也可以像下面一样操作?

"AAABBAAC" 
|> String.graphemes 
|> Enum.chunk_by(fn x -> x end) 
|> Enum.map(fn x -> [Enum.at(x,0), Enum.count(x)] end) 
|> List.flatten 
|> Enum.join