2017-01-08 9 views
1

Для извлечения значения (записей) о качестве orddict в отсортированном списке, попытался это:сортировать значения в 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 - это функция, предоставляемая для добавления значения к существующей паре Key/Value, где Value должен быть списком. В используемом случае ключ не существует, поэтому создается пара и добавляется значение в пустой список.

Btw, вы всегда можете распечатать и сравнить реальный и ожидаемый результат.

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

Для примера, который:

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

Причина в том, что 'orddict: append/3' - это функция, предоставляемая для добавления значения к существующей паре Key/Value, где Value должно быть списком. В используемом случае ключ не существует, поэтому создается пара, а значение добавляется в пустой список – Pascal

+0

@Pascal, спасибо, я обновил ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^