Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 在列表中对Erlang记录进行排序?_Sorting_Erlang - Fatal编程技术网

Sorting 在列表中对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

我在erlang有一个记录:

-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}]