首页 > 解决方案 > Elixir - 从 Enum.each() 获取地图

问题描述

我是新手Elixir,正在尝试这个练习。以下是我的代码:

  def count(sentence) do
    a = sentence
        |> String.downcase()
    sort_a = Regex.split(~r/([^a-z(\-)]+)/, a)
             |> Enum.sort()
    uniq_a = Enum.uniq(sort_a)
    
    map = Map.new(uniq_a,fn x -> { x, 0 } end)

    final_map = Enum.each(map, fn {k, v} ->
      Map.replace!(map, k, v + match_check(k, sort_a))  
    end)
    final_map
  end

  def match_check(x, [word|words]) do
    if x == word do
      1
    else
      0
    end
    match_check(x, words)
  end

  def match_check(x, []), do: nil

目前,我被困在Enum.each/2,只会返回:ok。因此我final_map会得到:ok。我怎样才能得到结果?

标签: elixir

解决方案


不创建帐户就无法查看您的链接,所以我不确定问题出在哪里,但Enum.each/2旨在执行副作用,例如打印值,因此您通常不关心返回值。对于转换值,您通常需要Enum.map/2. 例如:

Enum.each(["hello", "world!"], &IO.puts/1)

返回:ok和打印:

hello
world!

相比:

Enum.map(["hello", "world!"], &String.capitalize/1)

不打印任何内容,并返回:

["Hello", "World!"]

从您的示例中,我猜您正在尝试计算句子中唯一单词的数量,而忽略大小写。在这种情况下,使用String.split/1Enum.reduce/3和的可能解决方案Map.update/4是:

"a b B CC cc cC"
|> String.split()
|> Enum.reduce(%{}, fn word, counts ->
  Map.update(counts, String.downcase(word), 1, &(&1 + 1))
end)

输出:

%{"a" => 1, "b" => 2, "cc" => 3}

推荐阅读