elixir - Elixir - 从 Enum.each() 获取地图
问题描述
我是新手Elixir
,正在尝试这个练习。以下是我的代码:
def count(sentence) do
a = sentence
|> String.downcase()
sort_a = Regex.split(~r/([^a-z(\-)]+)/, a)
|> Enum.sort()
uniq_a = Enum.uniq(sort_a)
map = Map.new(uniq_a,fn x -> { x, 0 } end)
final_map = Enum.each(map, fn {k, v} ->
Map.replace!(map, k, v + match_check(k, sort_a))
end)
final_map
end
def match_check(x, [word|words]) do
if x == word do
1
else
0
end
match_check(x, words)
end
def match_check(x, []), do: nil
目前,我被困在Enum.each/2
,只会返回:ok
。因此我final_map
会得到:ok
。我怎样才能得到结果?
解决方案
不创建帐户就无法查看您的链接,所以我不确定问题出在哪里,但Enum.each/2
旨在执行副作用,例如打印值,因此您通常不关心返回值。对于转换值,您通常需要Enum.map/2
. 例如:
Enum.each(["hello", "world!"], &IO.puts/1)
返回:ok
和打印:
hello
world!
相比:
Enum.map(["hello", "world!"], &String.capitalize/1)
不打印任何内容,并返回:
["Hello", "World!"]
从您的示例中,我猜您正在尝试计算句子中唯一单词的数量,而忽略大小写。在这种情况下,使用String.split/1
、Enum.reduce/3
和的可能解决方案Map.update/4
是:
"a b B CC cc cC"
|> String.split()
|> Enum.reduce(%{}, fn word, counts ->
Map.update(counts, String.downcase(word), 1, &(&1 + 1))
end)
输出:
%{"a" => 1, "b" => 2, "cc" => 3}
推荐阅读
- python - 在 Python 中为线性拟合(带有两个参数)生成置信区间等高线图
- haskell - Haskell中函数名称后的单引号/撇号(')是什么意思?
- python - 如何将轮廓扩大特定数量的像素(不迭代每个像素)?
- python - 如何迭代时间序列行并获取特定值的时间戳?
- mysql - 我正在尝试在 mysql 中进行动态支点
- css - 在不拉伸的情况下将静态 Google Map API 调整为自定义大小
- google-bigquery - 标准 SQL 查询效率
- c++ - 在 C++ 中优化 MySQL 插入
- matlab - Matlab中矩阵乘法的SVD
- javascript - 使用布尔值的内联 NOT 运算符