在列表中对Erlang记录进行排序?

标签 sorting erlang

我在erlang中有一条记录:

-record(myrec,
    { 
      id = 0,
      price = 0,
      quantity = 0
    }).

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

我如何为此定义一个乐趣?

我是Erlang的新手:)

谢谢,
尼斯巴士

最佳答案

这是比到目前为止建议的解决方案更短的解决方案。首先定义您的记录:

1> rd(myrec, {id=0, price=0, quantity=0}).
myrec

然后让我们发明其中的三个:
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>

并将其插入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}]

现在,该订单为[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}]

给我们[B, C, A]。这对读者来说并不明显,因此您最好记录下来,或者在这种情况下使用Dustin的解决方案。这里介绍的解决方案的优点是不需要嵌套。通过在比较中的任何一个元组中设置元素,您几乎可以根据需要对它们进行比较,而无需花费更长的时间。

关于在列表中对Erlang记录进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723064/

相关文章:

sorting - 语义媒体维基 : Sort values by date

erlang - 将文件读入字符串列表的最有效方法

erlang - Erlang 中的排列示例

javascript - 根据数字数组 : Another version (Not duplicate! 对字符串数组进行排序!)

java - 按扩展名和 Java 网站名称的字母顺序对网站名称进行排序

javascript - 数组排序: Alphabetical and Numerically

Erlang store 初始应用配置

network-programming - 将 SO_REUSEPORT 与 Phoenix 一起使用

erlang - 我如何知道 Elixir 服务器上的可用内存量?

C++ 在没有 lambda 的情况下对索引 vector 进行排序