口で言うより行うことがErlang習得への近道と信じています。
異なる型の比較
Erlangではどんな型の組み合わせでも大小の比較判定が可能です。
number < atom < reference < function < port < pid < tuple < map < list < bitstring
lists:sort/1
sort([term]) -> [term]
sort(リスト) -> ソートされたリスト
リストをソートして新しいリストを返します。どんなリストに対しても実行可能です。
> lists:sort([2, 1, 4, 3]).
[1,2,3,4]
> lists:sort([2.0, 1.0, 4.0, 3.0]).
[1.0,2.0,3.0,4.0]
> lists:sort([[5], #{x => 4.0}, <<6>>, {3}, two, 1]).
[1,two,{3},#{x => 4.0},[5],<<6>>]
結果から重複する要素を取り除きたい場合は、代わりにlists:usort/1を使います。
> lists:usort([2, 1, 4, 3, 1, 2]).
[1,2,3,4]
lists:sort/2
sort(fun((A::term, B::term) -> boolean), [term]) -> [term]
sort(オレオレ大小比較関数, リスト) -> ソートされたリスト
オレオレ大小比較ルールでリストのソートができます。どんなリストに対しても実行可能です。オレオレ大小比較関数は、AとBとを比較して小さいか等しい場合にtrue
を、それ以外の場合にfalse
を返すようにします。
% 降順でソート
> lists:sort(fun (A, B) -> B =< A end, [2, 1, 4, 3, 2, 1]).
[4,3,2,2,1,1]
% '闘魂'アトムが必ず前に来るような並び順
> ToukonFirst = fun ('闘魂', _) -> true; (_, '闘魂') -> false; (A, B) -> A =< B end.
#Fun<erl_eval.41.3316493>
> lists:sort(ToukonFirst, [2, 1, '闘魂', 3, '闘魂']).
['闘魂','闘魂',1,2,3]
結果から重複する要素を取り除きたい場合は、代わりにlists:usort/2を使います。
> lists:usort(fun (A, B) -> B =< A end, [2, 1, 4, 3, 2, 1]).
[4,3,2,1]
lists:keysort/2
keysort(integer, [tuple]) -> [tuple]
keysort(タプルの要素の位置, タプルのリスト) -> ソートされたタプルのリスト
タプルのリストをソートして新しいリストを返します。 ソートはタプルの指定された位置の要素に対して行われます。
> L1 = [{"B", 3}, {"C", 1}, {"A", 2}, {"A", 2}].
% 1番目の要素でソート
> lists:keysort(1, L1).
[{"A",2},{"A",2},{"B",3},{"C",1}]
% 2番目の要素でソート
> lists:keysort(2, L1).
[{"C",1},{"A",2},{"A",2},{"B",3}]
結果から重複する要素を取り除きたい場合は、代わりにlists:ukeysort/2を使います。
> lists:ukeysort(1, L1).
[{"A",2},{"B",3},{"C",1}]
> lists:ukeysort(2, L1).
[{"C",1},{"A",2},{"B",3}]
listsモジュールには他にもリスト処理のための関数がたくさんあります。
Elixirにも挑戦したい
闘魂ElixirシリーズとElixir Schoolがオススメです。