2017-06-15 29 views
0

私は地図上に情報の格納が必要な単純なPOCをElixirで開発しようとしています。問題は、値でソートされたリストとしてマップを表示する方法を理解できないことです。エリクサーでキーワードリストをどのように並べ替えますか?

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))) 

、これのバリエーションの任意の数を、しかし、何度もドキュメントを読んだことは私を助けていません。何かアドバイス?

答えて

5

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] 

その要素の1つの値でタプルのリストをソートするはるかにエレガントな方法もあります:List.keysort/2

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

ありがとう!私はこれをどうやって行うのか分かりませんでしたが、それはとても簡単でした。このsort_byシグネチャが何を意味するのかちょっと洞察できますか? 'sort_by(enumerable、mapper、sorter \\< =/2)'私はそれを使っていましたが、私はそれが何をすべきか理解していないと思います。 – smkarber

+0

'mapper'は、' enumerable'の各項目で呼び出される関数です。 'mapper'が返す値は、' <= '演算子を使って比較されます。つまり、昇順にソートされます。 '&> ='を渡すと、降順ソートを行う必要があります。 (Sidenote:あなたがそれを言及するまで、 'Enum.sort_by'がオプションの第3引数を持っているかどうか分かりませんでした!) – Dogbert

+0

私はあなたにアドバイスを提供するのは遠いですが、 a')将来の訪問者が答えに従うのをより容易にするドキュメンテーション['Enum.sort_by/3'](https://hexdocs.pm/elixir/Enum.html#sort_by/3)に答えてください。b)ボーナスとして、追加のパラメータを持つ関数のアリティのようなものをすべて発見します。 – mudasobwa

関連する問題