Erlang 长生不老药累加器地图列表
你能帮我实现地图列表中的一个累加器吗Erlang 长生不老药累加器地图列表,erlang,elixir,Erlang,Elixir,你能帮我实现地图列表中的一个累加器吗 [ %{ score: 1, name: "Javascript", }, %{ score: 2, name: "Elixir", }, %{ score: 10, name: "Elixir", } ] 结果应该是: [ %{ score: 12, name: "Elixir", }, %{ score: 1,
[
%{
score: 1,
name: "Javascript",
},
%{
score: 2,
name: "Elixir",
},
%{
score: 10,
name: "Elixir",
}
]
结果应该是:
[
%{
score: 12,
name: "Elixir",
},
%{
score: 1,
name: "Javascript",
}
]
谢谢你的建议
关于假设您的原始列表存储在
输入
局部变量中,可以从用作减速机开始
Enum.reduce(输入,%{},fn%{score:score,name:name},acc->
地图更新(acc、名称、分数和1+分数)
(完)
#⇒%{“长生不老药”=>12,“Javascript”=>1}
无论你是否坚持要有一个地图列表作为结果(这是IMSO可读性较差的一种方式),再进一步,结果是:
Enum.map(%%{“Elixir”=>12,“Javascript”=>1},fn{name,score}->
%{name:name,score:score}
(完)
#⇒[%{姓名:“长生不老药”,分数:12},
#%{name:“Javascript”,分数:1}]
总而言之:
输入
|>Enum.reduce(%{},fn%{分数:分数,名称:名称},acc->
地图更新(acc、名称、分数和1+分数)
(完)
|>map(&%{name:elem(&1,0),score:elem(&1,1)})
#⇒[%{姓名:“长生不老药”,分数:12},
#%{name:“Javascript”,分数:1}]
旁注:中的贴图(因此,中的贴图)没有顺序。这意味着,如果希望结果列表按
名称
,或按分数
排序,则应明确指出:
Enum.sort(…,&&1.score>&2.score)
#⇒[%{姓名:“长生不老药”,分数:12},
#%{name:“Javascript”,分数:1}]
一种简单的方法是使用名称对项目进行分组,然后对分数进行求和:
列表
|>枚举分组依据(&&1.name,&&1.score)
|>map(fn{name,score}->%{name:name,score:Enum.sum(score)}end)
输出:
[%{name:“长生不老药”,分数:12},%{name:“Javascript”,分数:1}]
如果您希望创建和使用更通用的解决方案,您可以创建自己的合并模块
defdo
def merge_by(可枚举,name_fun,merge_fun)do
可枚举
|>枚举分组人(名称)
|>map(fn{u name,items}->Enum.reduce(items,merge\u fun)end)
终止
终止
列表=[
%{score:1,name:“Javascript”},
%{分数:2,名字:“长生不老药”},
%{分数:10,名字:“长生不老药”}
]
merge.merge_by(list,&&1.name,&%{&1 | score:&1.score+&2.score})
#=>[%{name:“长生不老药”,分数:12},%{name:“Javascript”,分数:1}]
当你问这些问题时,你应该分享你所做的任何研究和你已经尝试过的任何代码。现在看来(毫无疑问,这是错误的),你在这里发布之前并没有努力解决自己的问题。再次感谢