在列表中排序Erlang记录?

nis*_*bus 10 sorting erlang

我在erlang中有记录:

-record(myrec,
    { 
      id = 0,
      price = 0,
      quantity = 0
    }).
Run Code Online (Sandbox Code Playgroud)

然后我有一个记录列表,我想按ID和价格排序,按降序和升序排列,其中price是第一个键,如果两个记录具有相同的价格,我想按ID排序.

我怎样才能为此定义乐趣?

我是Erlang的新手:)

谢谢,nisbus

I G*_*ICE 15

这是一个比目前为止所建议的更短的解决方案.首先定义你的记录:

1> rd(myrec, {id=0, price=0, quantity=0}).
myrec
Run Code Online (Sandbox Code Playgroud)

然后让我们发明其中的3个:

2> A = #myrec{id=1, price=10, quantity=2}, B = #myrec{id=2, price=4, quantity=3}, C = #myrec{id=3, price=10, quantity=1}.
#myrec{id = 3,price = 10,quantity = 1
Run Code Online (Sandbox Code Playgroud)

现在我们需要一个比较功能.这是解决方案更短的地方.Erlang可以按照它们出现的顺序比较元组的术语,所以如果我们想按价格排序,那么通过id,我们只需要比较形式的两个元组{PriceA, IdA} < {PriceB, IdB}:

3> F = fun(X, Y) -> {X#myrec.price, X#myrec.id} < {Y#myrec.price, Y#myrec.id} end.
#Fun<erl_eval.12.113037538>
Run Code Online (Sandbox Code Playgroud)

插上电源lists:sort/2:

4> lists:sort(F, [C,B,A]).
[#myrec{id = 2,price = 4,quantity = 3},
 #myrec{id = 1,price = 10,quantity = 2},
 #myrec{id = 3,price = 10,quantity = 1}]
Run Code Online (Sandbox Code Playgroud)

现在[B, A, C]是订单,您的列表已排序.

请注意,如果您想通过降序 id 进行排序,可以通过反转元组中的ID来欺骗它,如下所示:

5> G = fun(X, Y) -> {X#myrec.price, Y#myrec.id} < {Y#myrec.price, X#myrec.id} end.
#Fun<erl_eval.12.113037538>
6> lists:sort(G, [C,B,A]).                                                       
[#myrec{id = 2,price = 4,quantity = 3},
 #myrec{id = 3,price = 10,quantity = 1},
 #myrec{id = 1,price = 10,quantity = 2}]
Run Code Online (Sandbox Code Playgroud)

给我们[B, C, A].这不是明摆着给读者,所以你最好的文档,或使用达斯汀的解决方案在这种情况下.这里提出的解决方案的优点是不需要嵌套.通过比较在任一元组设置的元素,你几乎可以比拟,因为其中许多,你想不使代码长得多.