Это более короткое решение, чем было предложено до сих пор.Сначала определите вашу запись:
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
Теперь нам нужна функция сравнения.Вот где решение короче.Эрланг может сравнивать термины кортежа в порядке их появления, поэтому, если мы хотим отсортировать по цене, то по 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]
, и ваш список отсортирован.
Обратите внимание, что если вы хотите отсортировать по по убыванию Вместо этого, вы можете обмануть его, изменив идентификаторы в кортежах следующим образом:
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]
.Это не очевидно для читателя, поэтому вам лучше документировать это или использовать решение Дастина в этом случае.Преимущество решения, представленного здесь, заключается в том, что нет необходимости в вложении.Установив элементы в любом кортеже для сравнения, вы можете в значительной степени сравнить их столько, сколько захотите, не делая код намного длиннее.