2017-01-08 23 views
1

爲了提取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}與比較功能匹配。

+0

只是想知道爲什麼你希望,因爲它已經被排序的orddict排序? – rvirding

+0

的目標是提取和排序orddict的值(它恰好是記錄) – Francois

回答

2

正確的語法是:

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

我不是在文檔中找不到關於此的註解,但你可以在模塊的source code

由於@Pascal在評論中寫道,原因是orddict:append/3是一個函數,用於將值附加到現有的鍵/值對,其中值必須是列表。在用例中,鍵不存在,所以創建該對並將值附加到空列表中。

順便說一句,你總是可以打印和比較實際和預期的結果。

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

爲了您的例子是:

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

原因是'orddict:append/3'是一個函數,用於將值附加到現有的鍵/值對,其中值必須成爲一個列表。在用例中,關鍵字不存在,所以創建對並將Value附加到空列表 – Pascal

+0

@Pascal,謝謝,我更新了答案。 –