在Erlang中对列表进行排序

时间:2010-10-22 09:38:01

标签: erlang

如何根据每个元素的标记对Erlang中的列表进行排序?

如果我有一个循环并从多个进程接收单个值的进程,那么我想在接收到一个元素时根据标记(这是一个索引)排列列表。

如何在不使用BIF的情况下执行此操作?

我目前执行以下操作,但希望在添加元素时排列列表,例如使用标记的插入排序。

fibLoop(calcData) ->
receive
 {Number, Tag} ->
 fibLoop([{Number, Tag}|calcData]);

2 个答案:

答案 0 :(得分:2)

这样的事可能有用:

insert({_, Tag} = Data, [{_,HTag}|_] = List) when Tag >= HTag ->
  [Data | List];
insert(Data, [H | T]) ->
  [H | insert(Data, T)];
insert(Data, []) ->
  [Data].

答案 1 :(得分:2)

有多种方法可以执行您想要的操作,稍微取决于您希望以后使用该值的方式。

简单的解决方案是使用gb_trees。 gb_trees是一个排序结构,可以使用迭代器循环。

或者,如果你想保持简单并有一个列表,你可以使用orddict(或可能是ordsets)。

orddict:store(Number, Tag, CalcData)

将{Number,Tag}插入有序列表。有关更多信息,请参阅orddict的文档。

要获得列表中的最小值,您可以使用hd / 1,并获得最大的列表:last / 1(不是我建议列表:最后一个,请注意)。