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