2

各タプルの 2 番目の要素に従ってタプルをソートする必要がありますが、明らかに usort/1 は最初の要素でのみ機能します。したがって、要素を交換し、並べ替えて元に戻す必要があります。もっと簡単な方法はありますか?また、降順で並べ替える方法もあります (並べ替えと反転ができることは知っていますが、知りたいだけです)。

4

4 に答える 4

4

keysort/2関数 (または対応するukeysort/2 )を試しましたか?

> lists:reverse(lists:keysort(2, [{a,2}, {b,1}, {c, 3}])).
[{c,3},{a,2},{b,1}]

非常に大きなリストをソートしない場合、これはおそらく最も読みやすい解決策です。

于 2008-10-08T07:27:57.127 に答える
3

実際、より良い答え:

ソート関数を使用する sort の 2 番目のバージョンがあります。

lists:sort(Fun, List1) -> List2

タプルの 2 番目の要素でソートする例を次に示します。

lists:sort(fun(A, B) ->
                   {A1, A2} = A,
                   {B1, B2} = B,
                   if
                       A2 > B2 ->
                           false;
                       true ->
                           true
                   end
           end, YourList).
于 2008-10-08T06:29:44.200 に答える
2

bmdhacks のソリューションの改良版:

lists:sort(fun(A, B) ->
                   {_, A2} = A,
                   {_, B2} = B,
                   A2 =< B2
           end, YourList).

アンダースコアは、コンパイラが警告を出すため、A1 や B1 よりも優れています。

降順でソートするには、<= を >= に変更します。

于 2008-10-08T07:22:26.433 に答える
0

独自のソート関数を作成するのはそれほど難しいことではありません (一般的な例を基にしています)。

qsort([]) -> [];
qsort([Pivot|Tail]) ->
    {PivotFirst, PivotSecond} = Pivot,
    qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement < PivotSecond])
        ++ [Pivot] ++
        qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement >= PivotSecond]).
于 2008-10-08T06:14:13.187 に答える