[erlang-questions] map elements in defined order

Sverker Eriksson sverker.eriksson@REDACTED
Thu Oct 26 19:10:34 CEST 2017


On 10/26/2017 05:30 PM, Ulf Wiger wrote:
> Looking at the maps API, I see no function that can present the 
> contents of a map in the defined order.
>
> Because there IS a defined order, described in the Erlang Reference 
> Manual:
>
> «Maps are ordered by size, two maps with the same size are compared by 
> keys in ascending term order and then by values in key order. In maps 
> key order integers types are considered less than floats types.»
>
> Note that the key ordering described above doesn't follow normal 
> Erlang term ordering, so lists:sort(maps:to_list(Map)) will produce 
> something will a well-defined order, but comparing the sorted lists of 
> two maps is not guaranteed to have the same outcome as comparing the 
> maps themselves.
>
> I can solve this by using lists:sort/2, but this seems contrived.
>
> To clarify, e.g. msgpack:pack(Map) will perform a maps:to_list(Map). 
> This is not guaranteed to produce the same result across Erlang 
> versions, since maps:to_list/1 says pairs "are returned in arbitrary 
> order".
>
> Yet there is no alternative API function that will return pairs in the 
> defined sort order, although presumably there is an efficient internal 
> implementation for producing it.
>

There is an efficient internal implementation to compare two terms in 
map-key order (undocumented erts_internal:cmp_term/2).

But there is no efficient implementation to produce a map-key-value 
ordered list. That would require N*log(N) sorting.

'==' for hashmaps (> 32 keys) does a one pass iteration in key hash 
order over both trees (HAMTs) and keeps track of the minimal key or 
value seen so far.



/Sverker





More information about the erlang-questions mailing list