2008-10-08 111 views
2

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

回答

4

您是否试过keysort/2函数(或其对应的ukeysort/2)?

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

如果你不排序非常大的列表,这可能是你可以得到的最可读的解决方案。

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]). 
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

的bmdhacks'解决方案的一个改进版本:

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

下划线更好然后A1和B1,因为编译器会给出警告 那些。

要按降序排列,只需将< =更改为> =。

相关问题