本文介绍了当您在地图上操作时,键和值的顺序是否保留在药剂中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我在药剂中有一张地图:

m = %{"a"=>1, "b"=>2, "c" => 3}

如果我调用Map.values(m),是否保证返回值始终为[1, 2, 3],而不是[3, 1, 2]

这是我从文档中不清楚的一件事。经过初步测试,我认为是这样的。

推荐答案

Elixir和Erlang中的Map实现有一些令人困惑的属性。对于较小的条目值,它是一个排序的键列表,因此看起来具有您在简单实验中看到的属性。

在一定数量的条目(我认为是32个)之上,实现切换到Hash Array Mapping Trie,您看到的所有属性都会消失。在一般情况下,您不能依赖于映射的键或值的顺序。请参阅

https://en.wikipedia.org/wiki/Hash_array_mapped_trie

,以解释Map的底层结构。

 iex(7)> 1..33 |> Enum.reduce(%{}, fn(x, acc) -> Map.put(acc,x,x) end )
%{11 => 11, 26 => 26, 15 => 15, 20 => 20, 17 => 17, 25 => 25, 13 => 13, 8 => 8,   7 => 7, 1 => 1, 32 => 32, 3 => 3, 6 => 6, 2 => 2, 33 => 33, 10 => 10, 9 => 9,   19 => 19, 14 => 14, 5 => 5, 18 => 18, 31 => 31, 22 => 22, 29 => 29, 21 => 21,   27 => 27, 24 => 24, 30 => 30, 23 => 23, 28 => 28, 16 => 16, 4 => 4, 12 => 12}

iex(8)> Map.keys(v(7)) [11, 26, 15, 20, 17, 25, 13, 8, 7, 1, 32, 3, 6, 2, 33, 10, 9, 19, 14, 5, 18, 31,  22, 29, 21, 27, 24, 30, 23, 28, 16, 4, 12]

iex(9)> Map.values(v(7)) [11, 26, 15, 20, 17, 25, 13, 8, 7, 1, 32, 3, 6, 2, 33, 10, 9, 19, 14, 5, 18, 31,  22, 29, 21, 27, 24, 30, 23, 28, 16, 4, 12]

这篇关于当您在地图上操作时,键和值的顺序是否保留在药剂中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-22 09:13