【发布时间】:2011-05-21 04:27:15
【问题描述】:
我有一本字典,想把它转换成一个列表。然后我想根据第二个元素(值)对包含 {Key, Value} 对的结果列表从 min 到 max 进行排序。
列表是否有内置的排序方法来处理这个问题,或者如何做到这一点?
谢谢
【问题讨论】:
标签: list sorting erlang tuples
我有一本字典,想把它转换成一个列表。然后我想根据第二个元素(值)对包含 {Key, Value} 对的结果列表从 min 到 max 进行排序。
列表是否有内置的排序方法来处理这个问题,或者如何做到这一点?
谢谢
【问题讨论】:
标签: list sorting erlang tuples
函数lists:keysort/2 非常适合这个。
1> lists:keysort(2, [{a,b},{b,a},{b,b}]).
[{b,a},{a,b},{b,b}]
2> lists:keysort(2, [{1,14},{3,10},{2,13}]).
[{3,10},{2,13},{1,14}]
【讨论】:
[ Key || {Key,Value} <- L ]或对应的lists:map/2函数。
按第二个元素排序的最简单方法是定义您自己的排序函数,其工作方式如下:
fun({KeyA,ValA}, {KeyB,ValB}) -> {ValA,KeyA} =< {ValB,KeyB} end.
并在lists:sort/2中调用它:
1> lists:sort(fun({KeyA,ValA}, {KeyB,ValB}) -> {ValA,KeyA} =< {ValB,KeyB} end., [{a,b},{b,a},{b,b}]).
[{b,a},{a,b},{b,b}]
这是因为 Erlang 总是会自动比较元组从第一个元素到最后一个元素。此函数交换第一个和第二个元素,因此第二个元素充当第一个比较点。然后,您的 dict 中的 Key 将用于对值相同的条目进行排序。
【讨论】:
[Key || {Key, _Val} <- List].
key_Y 这样的名称,它们是原子。变量需要使用KeyY,它们区分大小写。小写 = 原子,大写 = 变量。