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 需要一个排序函数:

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).
于 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 回答