Maps:to_list/1 element order.

Valentin Micic v@REDACTED
Fri Feb 28 12:19:16 CET 2020


Thanks Ulf.

Indeed, there’s always a cost. However, one should not inflict more cost than actually necessary, hence my question.

As for my specific “problem”, well, there are easier (and probably more efficient) ways than to convert map to list, thus,  having a version of  map:to_list/2 <maps:to_list/2> with the second argument explicitly specifying, say, a sorting order, would probably have just a *marginal* utility value, even if it would be faster than calling map:to_list/1 followed by lists:sort/1. 

V/


> On 28 Feb 2020, at 12:00, Ulf Wiger <ulf@REDACTED> wrote:
> 
> I should perhaps clarify that the cost of 'canonical' (in this case,
> sorting) would of course still be lower than calling lists:sort/1 to
> get what you need. Presumably, if you actually need the elements
> ordered, there will always be a cost.
> 
> BR,
> Ulf W
> 
> Den fre 28 feb. 2020 kl 10:58 skrev Ulf Wiger <ulf@REDACTED>:
>> 
>> This was discussed at length in a previous thread:
>> 
>> http://erlang.org/pipermail/erlang-questions/2017-October/093981.html
>> 
>> The short answer is "no", you can't rely on the order, and this should
>> perhaps be more clearly documented. In the future, it might be nice
>> with some 'canonical' option to e.g. term_to_binary/2, to ensure that
>> encoding is consistent. This would of course come at a cost.
>> 
>> BR,
>> Ulf W
>> 
>> Den fre 28 feb. 2020 kl 10:45 skrev Valentin Micic <v@REDACTED>:
>>> 
>>> Hi
>>> 
>>> Even though documentation indicates that:
>>> 
>>> to_list(Map) -> [{Key, Value}]
>>> 
>>> Types
>>> 
>>> Map = map()
>>> Key = Value = term()
>>> 
>>> 
>>> Returns a list of pairs representing the key-value associations of Map, where the pairs [{K1,V1}, ..., {Kn,Vn}] are returned in arbitrary order.
>>> 
>>> It appears that the list returned has been sorted in ascending order, using value of the key as a criterion for sorting.
>>> I did some testing using a bit modified example offered in documentation:
>>> 
>>> 
>>> (x@REDACTED)47> f(Map), Map = #{42 => value_three,1337 => "value two","a" => 1, 1 => "Last entered"},maps:to_list(Map).
>>> [{1,"Last entered"},
>>> {42,value_three},
>>> {1337,"value two"},
>>> {"a",1}]
>>> 
>>> 
>>> 
>>> When I changed 1337 to -1337, I get the result that indicates that the list of pairs is *not* returned in arbitrary order, but actually sorted:
>>> 
>>> 
>>> (x@REDACTED)48>
>>> (x@REDACTED)48> f(Map), Map = #{42 => value_three, -1337 => "value two","a" => 1, 1 => "Last entered"},maps:to_list(Map).
>>> [{-1337,"value two"},
>>> {1,"Last entered"},
>>> {42,value_three},
>>> {"a",1}]
>>> 
>>> 
>>> Could one relay on this always being the case?
>>> A I need this list to be sorted, I would hate to attempt sorting the already sorted list.
>>> 
>>> Thanks in advance
>>> 
>>> V/
>>> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20200228/72521010/attachment.htm>


More information about the erlang-questions mailing list