【问题标题】:In Elixir how do you sort a keyword list by value?在 Elixir 中,如何按值对关键字列表进行排序?
【发布时间】:2017-06-16 03:48:42
【问题描述】:

我正在尝试在 Elixir 中开发一个简单的 POC,需要在地图中存储信息。问题是我无法弄清楚如何将地图显示为按值排序的列表。

defmodule MapUpdater do
    def update_score(map, player, :double), do: Map.update(map, player, 2, &(&1 * 2))
    def update_score(map, player, :halve), do: Map.update(map, player, .5, &(&1 * 0.5))
    def update_score(map, player, :penalize), do: Map.update(map, player, -1, &(&1 - 1))
    def view_scores(map, :top), do: Map.to_list(map) |> Enum.sort_by(???)
    def view_scores(map, :bottom), do: Map.to_list(map) |> Enum.sort_by(???)
end

我试过了:

Enum.sort_by(&(elem(&1, 1)) > &(elem(&2, 1)))

以及任何数量的变体,但一遍又一遍地阅读文档对我没有帮助。有什么建议吗?

【问题讨论】:

    标签: list sorting elixir


    【解决方案1】:

    Enum.sort_by/2 采用一个元数为一的函数,并根据在每个元素上调用该函数返回的值对输入进行排序,因此应该是 |> Enum.sort_by(&(elem(&1, 1)))

    iex(1)> list = [a: 1, b: 2, c: 0, d: 3, e: -1]
    [a: 1, b: 2, c: 0, d: 3, e: -1]
    iex(2)> list |> Enum.sort_by(&(elem(&1, 1)))
    [e: -1, c: 0, a: 1, b: 2, d: 3]
    

    还有一种更优雅的方法可以根据其中一个元素的值对元组列表进行排序:List.keysort/2:

    iex(3)> list |> List.keysort(1)
    [e: -1, c: 0, a: 1, b: 2, d: 3]
    

    【讨论】:

    • 谢谢!我不知道如何做到这一点,但这很容易。您能否对这个 sort_by 签名的确切含义有所了解? sort_by(enumerable, mapper, sorter \\ &<=/2)我试图使用它,但我想我不明白它应该做什么。
    • mapper 是将在enumerable 的每个项目上调用的函数。 mapper 返回的值将使用<= 运算符进行比较,即升序排序。如果你传入&>=,它应该进行降序排序。 (旁注:直到你提到它,我才知道Enum.sort_by 有一个可选的第三个参数!)
    • 我远未向您提供建议,但如果您不介意,您可以链接您在文档Enum.sort_by/3 的答案中提到的功能,这 a) 使未来更容易访问者跟随答案,b) 作为奖励,将发现所有的东西,比如带有附加参数的函数的 arity。
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多