2016-04-03 12 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 

私がここでやろうとしているのは、文字列をソートモジュールに渡すことです。たとえば、 "Hi my name is bob"という文字列を渡してみましょう。これが渡されたら、 'a' 'b' 'c'と 'd'の4つのキーでマップを作成します。 次に、私のloopMapコードで、someMapマップとそのキーの数(n)を引数として渡そうとしています。次に、各キーのインスタンスの文字列を検索し、キーが見つかった場合は、見つかったキーごとにマップを1つ更新します。私は間違って何をやっている地図をループしてエリクシルのキー値を更新する

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

:私は私のsomeMapにloopMapを実行した後に

iがある更新されたマップを持っている必要がありますか?

答えて

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

関連する問題