在Elixir中,您如何按值对关键字列表进行排序?

smk*_*ber 0 sorting list elixir

我正在尝试在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
Run Code Online (Sandbox Code Playgroud)

我试过了:

Enum.sort_by(&(elem(&1, 1)) > &(elem(&2, 1)))
Run Code Online (Sandbox Code Playgroud)

以及这方面的任何变化,但一遍又一遍地阅读文档对我没有帮助.有什么建议?

Dog*_*ert 11

Enum.sort_by/2采用一个arity函数,并根据通过调用每个元素上的函数返回的值对输入进行排序,因此应该是|> 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]
Run Code Online (Sandbox Code Playgroud)

还有一种更优雅的方法来按元素之一的值对元组列表进行排序List.keysort/2:

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