Зацикливание карты и обновление значений ключей в Эликсире

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

Здесь я пытаюсь передать строку в модуль сортировки. Например, давайте передадим строку «Привет, меня зовут Боб». После этого я создаю карту с 4 ключами: «a», «b», «c» и «d». Затем в моем коде loopMap я пытаюсь передать свою карту someMap и количество ее ключей (n) в качестве аргументов. Затем я ищу в строке экземпляры каждого ключа, и если ключ найден, я обновляю свою карту на 1 для каждого найденного ключа.

после того, как я запустил loopMap на моем someMap, у меня должна быть обновленная карта, которая:

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

Что я делаю не так?


person frostmage    schedule 03.04.2016    source источник


Ответы (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)
person bitwalker    schedule 03.04.2016
comment
Что, если в моей карте есть атомы, которые не являются отдельными символами, такими как %{:ob => 0, :ame => 0}? - person frostmage; 03.04.2016
comment
В этом случае вы захотите уменьшить ключи карты вместо символов строки, а затем использовать регулярное выражение и получить количество совпадений для этой подстроки один раз для каждого ключа. - person bitwalker; 04.04.2016