【问题标题】:Elixir convert string to map code not workingElixir将字符串转换为地图代码不起作用
【发布时间】:2019-03-20 09:05:20
【问题描述】:

开发者们好,我在弄清楚如何使函数工作时遇到问题。

测试用例

  test "count one of each" do
    expected = %{"one" => 1, "of" => 1, "each" => 1}
    assert Words.count("one of each") == expected
  end

这就是我到目前为止想出的。

@spec count(String.t()) :: map
  def count(sentence) do
    sentence
    |> String.split
    |> Enum.map([sentence], &(%{sentence => 1 , value =>&1}))
  end
end

代码本身不起作用,有人可以根据我提供的测试解释如何实现以下功能吗?

非常感谢。

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: elixir


【解决方案1】:

从您的代码看来,您似乎还没有理解 pipes |>Enum 函数的工作原理。更详细地阅读文档可能会对您有所帮助。

这应该做你想做的:

"one of each"
|> String.split()
|> Enum.group_by(fn x -> x end)
|> Enum.map(fn {k, v} -> {k, length(v)} end) 
|> Enum.into(%{})

解释:

  1. 将字符串拆分成一个列表。
  2. 将列表分组到地图中。键是单词,值是包含每个出现的列表。
  3. 将每个列表转换为其长度计数
  4. 以地图形式返回结果

【讨论】:

    【解决方案2】:

    使用Enum.reduce

      def count(sentence) do
        sentence
        |> String.split() 
        |> Enum.reduce(%{}, fn word, sentence_map -> 
            Map.update(sentence_map, word, 1, fn existing_count -> existing_count+1
            end) 
         end)
       end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多