【问题标题】:lists:usort for nth element in tuple列表:对元组中的第 n 个元素进行排序
【发布时间】:2010-09-15 22:34:08
【问题描述】:

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

【问题讨论】:

    标签: erlang sorting


    【解决方案1】:

    编写自己的排序函数应该不会太难(改编自一个常见示例):

    qsort([]) -> [];
    qsort([Pivot|Tail]) ->
        {PivotFirst, PivotSecond} = Pivot,
        qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement < PivotSecond])
            ++ [Pivot] ++
            qsort([{FirstElement, SecondElement} || {FirstElement,SecondElement} <- Tail, SecondElement >= PivotSecond]).
    

    【讨论】:

      【解决方案2】:

      其实更好的答案:

      还有第二个版本的 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).
      

      【讨论】:

        【解决方案3】:

        bmdhacks 解决方案的改进版本:

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

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

        要按降序排序,只需将 =。

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-08
            • 2011-05-21
            • 2012-03-13
            • 2020-08-02
            • 2022-08-18
            • 1970-01-01
            • 2020-01-05
            相关资源
            最近更新 更多