Đây là một giải pháp ngắn hơn so với những gì đã được đề xuất cho đến nay. Đầu tiên xác định hồ sơ của bạn:
1> rd(myrec, {id=0, price=0, quantity=0}).
myrec
Sau đó, chúng ta hãy phát minh ra 3 trong số họ:
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
Bây giờ chúng ta cần một hàm so sánh. Đây là nơi giải pháp ngắn hơn. Erlang có thể so sánh về một tuple theo thứ tự chúng xuất hiện, vì vậy nếu chúng ta muốn sắp xếp theo giá, sau đó bởi id, chúng tôi chỉ phải so sánh hai bộ dữ liệu của form {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>
Và cắm nó trong 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}]
Đơn đặt hàng bây giờ là [B, A, C]
và danh sách của bạn được sắp xếp.
Lưu ý rằng nếu bạn muốn sắp xếp theo giảm dần id thay vào đó, Bạn có thể đánh lừa nó bằng cách đảo ngược các id trong các bộ như sau:
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}]
Cho chúng tôi [B, C, A]
. Điều này là không rõ ràng cho người đọc, vì vậy bạn nên tài liệu tốt hơn hoặc sử dụng giải pháp của Dustin trong trường hợp này. Ưu điểm của giải pháp được trình bày ở đây là không có yêu cầu làm tổ. Bằng cách thiết lập các phần tử trong tuple trong so sánh, bạn có thể so sánh khá nhiều phần tử như bạn muốn mà không cần tạo mã dài hơn nhiều.
Thats chỉ đơn giản là mát mẻ. Cảm ơn – nisbus
Đó là trường hợp sau đó tại sao thậm chí xác định một hàm f, tại sao không chỉ danh sách: sắp xếp ([C, B, A])? – Vishal