【问题标题】:Looping a map and updating key values in Elixir在 Elixir 中循环映射并更新键值
【发布时间】:2016-04-03 18:18:44
【问题描述】:
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

我在这里要做的是将一个字符串传递给排序模块。例如,让我们传递字符串“Hi my name is bob”。一旦通过,我将创建一个包含 4 个键的映射:'a''b''c' 和 'd'。 然后在我的 loopMap 代码中,我试图将我的 someMap 映射及其键数(n)作为参数传递。然后我在字符串中搜索每个键的实例,如果找到该键,我会为找到的每个键将我的地图更新 1。

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

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

我做错了什么?

【问题讨论】:

    标签: loops dictionary increment elixir


    【解决方案1】:

    一个更简单的解决方案是:

    "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)
    

    【讨论】:

    • 如果我的地图中的原子不是单个字符,例如 %{:ob => 0, :ame => 0},该怎么办?
    • 在这种情况下,您需要减少映射键而不是字符串的字符,然后使用正则表达式并为每个键获取该子字符串的匹配数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2012-03-31
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2018-08-22
    相关资源
    最近更新 更多