Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming Elixir获取包含特定字段最大值的映射_Functional Programming_Elixir - Fatal编程技术网

Functional programming Elixir获取包含特定字段最大值的映射

Functional programming Elixir获取包含特定字段最大值的映射,functional-programming,elixir,Functional Programming,Elixir,我是长生不老药编程语言的初学者 我有一个类似这样的物体: { id: uuid, created_at: DateTime.t, updated_at: DateTime.t, type: my_type } 比如说,myu类型是~w[abcd] 我想编写一个函数,它获取这些对象的列表并返回以下映射: %{ A: 120, B: 220, C: 560, D: 0, any: 560 } 这里的值必须是每个我的类型+的在列(Timex.diff(更新时,

我是长生不老药编程语言的初学者

我有一个类似这样的物体:

{
  id: uuid,
  created_at: DateTime.t,
  updated_at: DateTime.t,
  type: my_type
}
比如说,
myu类型
~w[abcd]

我想编写一个函数,它获取这些对象的列表并返回以下映射:

%{
  A: 120,
  B: 220,
  C: 560,
  D: 0,
  any: 560
} 
这里的值必须是每个
我的类型
+
列(
Timex.diff(更新时,创建时,:秒)
)上更新时和创建时的最大差值。 在
any
的情况下,不考虑
myu类型
,并在列表中的所有对象中取最大值


用长生不老药最好的方法是什么?谢谢。

以下内容将按列表类型对列表进行分组,然后计算每个组的最大差异,最后生成一个包含每个类型作为键、最大差异作为值的映射

map = list
|> Enum.group_by(& &1.type)
|> Enum.map(fn {type, values} ->
  max =
    values
    |> Enum.map(fn %{created_at: created_at, updated_at: updated_at} ->
      # return the difference here
    end)
    |> Enum.max
  {type, max}
end)
|> Map.new
这会给你一些类似的信息:

%{
  A: 120,
  B: 220,
  C: 560,
  D: 0
}

现在,您可以通过执行
map |>map.values |>Enum.max
来计算
any
的值。下面将按列表的类型对列表进行分组,然后计算每个组的最大差异,最后生成一个包含每个类型作为键、最大差异作为值的映射

map = list
|> Enum.group_by(& &1.type)
|> Enum.map(fn {type, values} ->
  max =
    values
    |> Enum.map(fn %{created_at: created_at, updated_at: updated_at} ->
      # return the difference here
    end)
    |> Enum.max
  {type, max}
end)
|> Map.new
这会给你一些类似的信息:

%{
  A: 120,
  B: 220,
  C: 560,
  D: 0
}

现在,您可以通过执行
map |>map.values |>Enum.max
来计算
any
的值。为了格式和多样性,我在这里发布这篇文章。@Dogbert的答案可能更合适,尽管这种方法可能更直接,也更灵活

list=[%{type::a,v1:10,v2:20},
%{type::a,v1:10,v2:30},
%{type::b,v1:10,v2:20},
%{type::c,v1:10,v2:20}]
kw=for%{type:t,v1:v1,v2:v2}Enum.sort_by(fn{uu,v}->v end,&>=/2)
|>Enum.uniq_by(fn{k,{}->k end)
#⇒[a:20,b:10,c:10]

为了格式和多样性,我在这里发布这篇文章。@Dogbert的答案可能更合适,尽管这种方法可能更直接,也更灵活

list=[%{type::a,v1:10,v2:20},
%{type::a,v1:10,v2:30},
%{type::b,v1:10,v2:20},
%{type::c,v1:10,v2:20}]
kw=for%{type:t,v1:v1,v2:v2}Enum.sort_by(fn{uu,v}->v end,&>=/2)
|>Enum.uniq_by(fn{k,{}->k end)
#⇒[a:20,b:10,c:10]

如果您在此处键入准确的示例输入和预期输出,这样回答者就可以尝试他们的解决方案,这会很有帮助。具体有什么不清楚?我没有输入确切的例子,因为需要提供日期时间和计算差异。我想我可以避免这种情况。如果你在这里输入一个准确的示例输入和预期输出,这样回答者就可以尝试他们的解决方案,这将是很有帮助的。到底什么是不清楚的?我没有输入确切的例子,因为需要提供日期时间和计算差异。我以为我可以避免这个?另外,除了使用
group\u by
之外,还有一个空间可以使用
Keyword
的功能为同一个键提供多个值,并且像
for%{type:t,v1:v1,v2:v2}
Enum.max\u by/3
返回列表的原始元素,而不是映射值,因此需要再次计算差异。我看不出
into:[]
在这里有什么用。我们需要每种类型的最大值。除非你的意思是在这个
之后为
运行组,这应该是有效的。我发布了一个解决方案,它使用理解,而不是为了多样性而使用的答案。?另外,除了使用
group\u by
之外,还有一个空间可以使用
Keyword
的功能为同一个键提供多个值,并且像
for%{type:t,v1:v1,v2:v2}
Enum.max\u by/3
返回列表的原始元素,而不是映射值,因此需要再次计算差异。我看不出
into:[]
在这里有什么用。我们需要每种类型的最大值。除非你的意思是在这个
之后运行小组,这应该是可行的。我已经发布了一个解决方案,它使用理解,而不是为了多样性而作为答案。