【问题标题】:Elixir Get Map containing maximum values of specific fieldElixir 获取包含特定字段最大值的地图
【发布时间】:2017-11-14 16:14:20
【问题描述】:

我是 Elixir 编程语言的初学者。

我有一个类似这样的对象:

{
  id: uuid,
  created_at: DateTime.t,
  updated_at: DateTime.t,
  type: my_type
}

假设my_type~w[A B C D] 之一

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

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

此外,此处的值必须是 my_type + anyupdated_atcreated_at 列(Timex.diff(updated_at, created_at, :seconds))之间的最大差异。 在any 的情况下,my_type 不被考虑,并在列表中的所有对象中取最大值。

在 Elixir 中最好的方法是什么?谢谢。

【问题讨论】:

  • 如果您在此处输入准确的示例输入和预期输出将会很有帮助,以便回答者可以尝试他们的解决方案。
  • 究竟是什么不清楚?我没有输入确切的示例,因为需要提供日期时间并计算差异。我以为我可以避免这种情况

标签: functional-programming elixir


【解决方案1】:

下面会按照列表的类型对列表进行分组,然后计算每个组的最大差值,最后得到一个包含每个类型作为键和最大差值作为值的映射。

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 的值。

【讨论】:

  • Enum.max_by/3?此外,除了group_by,还有一个空间可以使用Keyword 的能力来为同一个键和for %{type: t, v1: v1, v2: v2} <- list, res <- {t, v1 - v2}, do: res, into: [] 之类的理解提供多个值。
  • Enum.max_by/3 返回列表的原始元素,而不是映射的值,因此需要再次计算差异。我不知道into: [] 在这里如何工作。我们需要每种类型的最大值。除非您的意思是在 for 之后运行 group_by,否则应该可以。
  • 为了多样性,我已经发布了使用理解的解决方案并且不使用Enum.group_by作为答案。
【解决方案2】:

出于格式和多样性的考虑,我将其发布在这里。 @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} <- list,
       do: {t, v2 - v1}, into: []
#⇒ [a: 10, a: 20, b: 10, c: 10]

kw
|> Enum.sort_by(fn {_, v} -> v end, &>=/2)
|> Enum.uniq_by(fn {k, _} -> k end)
#⇒ [a: 20, b: 10, c: 10]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2016-04-16
    • 2013-08-09
    相关资源
    最近更新 更多