lists:usort for元组中的第n个元素

时间:2008-10-08 05:59:02

标签: erlang sorting

我需要根据每个元组的第二个元素对元组进行排序,但显然usort / 1仅适用于第一个元素。所以我必须交换元素,使用它们并交换回来。是否有更简单的方法?还有一种方法可以按降序排序(我知道排序和反转可以完成,但只是想知道)。

4 个答案:

答案 0 :(得分:4)

您是否尝试过keysort/2功能(或其对应的ukeysort/2)?

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

如果您没有对非常大的列表进行排序,这可能是您可以获得的最易读的解决方案。

答案 1 :(得分:3)

实际上,一个更好的答案:

有第二个排序版本需要排序功能:

lists:sort(Fun, List1) -> List2

这是一个对元组中的第二个元素进行排序的示例:

lists:sort(fun(A, B) ->
                   {A1, A2} = A,
                   {B1, B2} = B,
                   if
                       A2 > B2 ->
                           false;
                       true ->
                           true
                   end
           end, YourList).

答案 2 :(得分:2)

bmdhacks解决方案的改进版本:

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

下划线比A1和B1更好,因为编译器会发出警告 对那些人来说。

要按降序排序,只需更改&lt; = to&gt; =。

答案 3 :(得分: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]).