循环地图并更新Elixir中的键值

时间:2016-04-03 18:18:44

标签: loops dictionary increment elixir

def sort(someString) do

    countSubstring = fn(_, "") -> 0
             (str, sub) -> length(String.split(str, sub)) - 1 end

    someMap = %{:a => 0, :b => 0, :c => 0, :d => 0}

    def loopMap(aMap, n) when n <= 1 do
        timesKeyFound = countSubstring(someString, aMap[n])
        Map.put_new(aMap, aMap[key], timesKeyFound)
    end

    def loopMap(aMap, n) do
        timesKeyFound = countSubstring(someString, aMap[n])
        Map.put_new(aMap, aMap[key], timesKeyFound)
        loopMap(aMap, n - 1)
    end

    loopMap(someMap, 4) #4 is the number of keys in the map
end

我在这里要做的是将字符串传递给排序模块。例如,让我们传递字符串&#34;嗨,我的名字是bob&#34;。一旦通过,我创建一个带有4个键的地图:&#39; a&#39; &#39; B&#39; &#39; C&#39;并且&#39; d&#39;。 然后在我的loopMap代码中,我试图将我的someMap映射及其键(n)的数量作为参数传递。然后我在字符串中搜索每个键的实例,如果找到了键,我会为找到的每个键更新我的地图。

在我的someMap上运行loopMap后,我应该有一个更新的地图:

%{a: 1, b: 2, c: 0, d: 0}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

更简单的解决方案是:

"Hi my name is Bob"
|> String.to_list
|> Enum.reduce(%{a: 0, b: 0}, fn c, acc ->
  case Map.get(acc, :'#{c}') do
    nil -> acc
    n -> Map.put(acc, :'#{c}', n + 1)
  end
end)