按内部元素erlang对元组进行排序

时间:2014-05-09 07:32:15

标签: sorting erlang tuples

我有一个元组:

Data = {
    'F_01_heirId', ["ak238", "ak239", "ak240", "ak241" ...],
    'F_01_0014', ["some text", "some more text", "a some more", "xcuub", ...],
    'F_02_0010', ["azcde", "axvdss" "scssd", "abcdefg as" ...],
    'F_02_0014', ["1222", "1", "1", "10", ...],
    ...
    }

需要按F_02_0010排序数据元组,因为我们根据排序对'F_02_0010'进行排序也会更改其他列表的相应元素。

以下是排序后所需的输出:

Data =  {
    'F_01_heirId', ["ak241", "ak239", "ak240", "ak238" ...]
    'F_01_0014', ["xcuub", "some more text", "a some more", "some text", ...],
    'F_02_0010', ["abcdefg as", "axvdss", "scssd", "azcde",  ...],
    'F_02_0014', ["10", "1", "1", "1222", ...],
    ...

    }

1 个答案:

答案 0 :(得分:1)

您对Data的表示不太适合您要执行的任务。以下是您必须完成的步骤:

  1. Data中提取列表,并将它们“压缩”为列表(或元组)列表。您必须使用可处理超过23列表的自定义zip函数:

    manyzip([L|Ists]) ->
      Fold =
        fun(List, Acc) ->
          lists:zipwith(fun(A,B) -> [A|B] end,List,Acc)
        end,
      Reversed = lists:foldl(Fold, [[E] || E <- L], Ists),
      [lists:reverse(E) || E <- Reversed].
    
  2. 对相应元素上的进行排序。您可以将lists:sort/2fun(A,B) -> lists:nth(4, A) < lists:nth(4, B) end等比较功能结合使用,其中4是压缩列表中F_02_0010的索引。
  3. 转换回manyzip/1也可以用于此任务!
  4. 恢复他们在元组中的位置。