我正在尝试计算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:
在主要问题中添加了一些代码,遵循社区中的最佳做法,以避免混淆和关闭主题的投票。无论如何,这个问题已经解决了。
答案 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.graphemes
将string
变为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