首页 > 解决方案 > Elixir将字符串转换为地图代码不起作用

问题描述

美好的一天开发人员,我在弄清楚如何使函数工作时遇到问题。

测试用例

  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

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

非常感谢。

标签: elixir

解决方案


从您的代码看来,您似乎还没有理解管道|>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. 将结果作为地图返回

推荐阅读