Elixir конвертировать строку в код карты не работает - PullRequest
0 голосов
/ 30 сентября 2018

Добрый день, разработчики, у меня проблемы с выяснением того, как заставить функцию работать.

Контрольный пример

  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

Сам код не работает, кто-нибудь может объяснить, как я могу достичь следующих функциональных возможностей на основе предоставленного мною теста?

Большойспасибо.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Из вашего кода похоже, что вы не поняли, как работают функции pipe |> или 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. Возвращение результата в виде карты
0 голосов
/ 30 сентября 2018

Использование 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
...