8赞
681
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在elixir中分组或计算重复的字母》经验,为你挑选了1个好方法。

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

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

期望的输出将是"3A2B2A1C".

将此字符串转换为a 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:

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



1> Patrick Osci..:

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

defmodule RunLengthEncoding do
  # public interface, take first char and remember it as the current value
  def encode(<>) do
    do_encode(rest, char, 1, "")
  end

  # current == last, increase the count and proceed
  defp do_encode(<>, char, count, acc) do
    do_encode(rest, char, count + 1, acc)
  end

  # current != last, reset count, encode previous values and proceed
  defp do_encode(<>, last, count, acc) do
    do_encode(rest, char, 1, acc <> to_string(count) <> <>)
  end

  # input empty, encode final values and return
  defp do_encode("", last, count, acc) do
    acc <> to_string(count) <> <>
  end
end


我不确定你的解决方案是否更具可读性@Hostert.较少的代码行不会自动更易读.单个字符变量比较长的名称短,但它们几乎不可读.
推荐阅读
author-avatar
俊廷淑易89
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有