如何根据每个元素的标记对Erlang中的列表进行排序?
如果我有一个循环并从多个进程接收单个值的进程,那么我想在接收到一个元素时根据标记(这是一个索引)排列列表。
如何在不使用BIF的情况下执行此操作?
我目前执行以下操作,但希望在添加元素时排列列表,例如使用标记的插入排序。
fibLoop(calcData) ->
receive
{Number, Tag} ->
fibLoop([{Number, Tag}|calcData]);
答案 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(不是我建议列表:最后一个,请注意)。