2016-04-03 53 views
0
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'。 然後在我的循環映射代碼中,我試圖通過我的someMap映射和它的鍵(n)的數量作爲參數。然後我在字符串中搜索每個鍵的實例,如果找到了鍵,我爲每個找到的鍵更新地圖1。循環地圖和更新Elixir中的鍵值

我跑我的someMap的loopMap後,我應該有一個更新的地圖是:

%{a: 1, b: 2, c: 0, d: 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) 
+0

如果我的映射具有原子不在單個字符如%{:OB => 0,:AME => 0}? – frostmage

+0

對於這種情況,您希望減少映射鍵而不是字符串的字符數,然後使用正則表達式併爲每個鍵獲取該子串的匹配數。 – bitwalker