2008-10-08 114 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,因爲編譯器會給出警告 那些。

要按降序排列,只需將< =更改爲> =。

相關問題