排序orddict的值

时间:2017-01-08 22:14:36

标签: sorting erlang hashtable

为了将orddict的值(记录)提取为排序列表,尝试了这个:

-module(test).
-compile(export_all).
-record(node, {name="", cost=0}).

test() ->
    List = orddict:append("A",#node{name="A",cost=1},
                          orddict:append("B",#node{name="B",cost=2},
                                         orddict:new())),
    lists:sort(fun({_,A},{_,B}) -> A#node.cost =< B#node.cost end,
               orddict:to_list(List)).

排序因exception error: {badrecord,node}而失败 什么是正确的语法?

解决:

正确的插入方法是orddict:store/2,而不是orddict:append/2。然后模式{_,A}匹配比较函数。

1 个答案:

答案 0 :(得分:2)

正确的语法是:

lists:sort(fun({_,[A]},{_,[B]}) -> A#node.cost =< B#node.cost end,
               orddict:to_list(List)).

我没有在文档中找到关于此的说明,但您可以查看模块的source code

正如@Pascal在评论中写的那样,原因是orddict:append/3是一个函数,用于将值附加到现有的Key / Value对,其中Value必须是一个列表。在用例中,密钥不存在,因此创建了对,并且值附加到空列表。

顺便说一句,您总是可以打印并比较实际和预期的结果。

io:format("~p~n",[orddict:to_list(List)])

对于您的示例:

[{"A",[{node,"A",1}]},{"B",[{node,"B",2}]}]