Sorting 在列表中对Erlang记录进行排序?
我在erlang有一个记录:Sorting 在列表中对Erlang记录进行排序?,sorting,erlang,Sorting,Erlang,我在erlang有一个记录: -record(myrec, { id = 0, price = 0, quantity = 0 }). 然后我有一个记录列表,我想按id和价格进行排序,降序和升序,其中价格是第一个键,如果两个记录的价格相同,我想按id进行排序 我该如何定义这个游戏的乐趣 我是Erlang的新手:) 谢谢, nisbus首先,您要了解如何比较您的记录: -spec compare(#myrec{}, #myrec{}) -&g
-record(myrec,
{
id = 0,
price = 0,
quantity = 0
}).
然后我有一个记录列表,我想按id和价格进行排序,降序和升序,其中价格是第一个键,如果两个记录的价格相同,我想按id进行排序
我该如何定义这个游戏的乐趣
我是Erlang的新手:)
谢谢,
nisbus首先,您要了解如何比较您的记录:
-spec compare(#myrec{}, #myrec{}) -> boolean().
compare(A, B) ->
case A#myrec.price == B#myrec.price of
true ->
A#myrec.id < B#myrec.id;
_ ->
B#myrec.price < A#myrec.price
end.
这是一个比目前所建议的更短的解决方案。首先定义您的记录:
1> rd(myrec, {id=0, price=0, quantity=0}).
myrec
那么让我们发明其中的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
现在我们需要一个比较函数。这是解决方案较短的地方。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>
现在的顺序是[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}]
5>G=fun(X,Y)->{X#myrec.price,Y#myrec.id}<{Y#myrec.price,X#myrec.id}结束。
#乐趣
6> 列表:排序(G、[C、B、A])。
[#myrec{id=2,价格=4,数量=3},
#myrec{id=3,价格=10,数量=1},
#myrec{id=1,价格=10,数量=2}]
给我们
[B,C,A]
。这对读者来说并不明显,所以在这种情况下,你最好将其记录下来或使用Dustin的解决方案。这里介绍的解决方案的优点是不需要嵌套。通过在比较中设置任一元组中的元素,您几乎可以比较任意数量的元素,而无需使代码变得更长。既然如此,那么为什么还要定义函数f,为什么不只列出:排序([C,B,a])?
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
3> F = fun(X, Y) -> {X#myrec.price, X#myrec.id} < {Y#myrec.price, Y#myrec.id} end.
#Fun<erl_eval.12.113037538>
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}]
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}]