List 在嵌套列表中筛选或匹配

List 在嵌套列表中筛选或匹配,list,nested,maps,elixir,List,Nested,Maps,Elixir,我的数据结构最初是一张大地图。但我读到,我们不应该使用太大的地图,以免原子耗尽。我的新数据结构就是这样的 countries = [[{'name', 'Germany'}, {'code', 'DE'}], [{'name', 'Austria'}, {'code', 'AT'}]] 我想制作一个filter\u by/3方法,根据属性name或code 我是否应该将元组转换为映射,或者是否有其他方法对此进行过滤?您可以使用映射列表。当检索元素时,映射非常有效,尤其是当映射中的键很少时 在您

我的数据结构最初是一张大地图。但我读到,我们不应该使用太大的地图,以免原子耗尽。我的新数据结构就是这样的

countries = [[{'name', 'Germany'}, {'code', 'DE'}], [{'name', 'Austria'}, {'code', 'AT'}]]
我想制作一个
filter\u by/3
方法,根据属性
name
code


我是否应该将元组转换为映射,或者是否有其他方法对此进行过滤?

您可以使用映射列表。当检索元素时,映射非常有效,尤其是当映射中的键很少时

在您的示例中:

countries = [%{name: "Germany", code: "DE"},
  %{name: "Austria", code: "AT"}]
请注意,即使在一个列表中使用数千个这样的映射,也永远不会耗尽原子,因为
:name
:code
始终是唯一分配的两个原子(因为每个原子都是值,所以编写
:a
:a
就像编写
3
3

一旦你有了一个类似的列表,你就可以使用如下功能对其进行过滤:

def filter_by(countries, key, value) do
  Enum.filter(countries, fn(country) -> country[key] == value end)
end

filter_by(countries, :code, "AT")

你可以使用地图列表。当检索元素时,映射非常有效,尤其是当映射中的键很少时

在您的示例中:

countries = [%{name: "Germany", code: "DE"},
  %{name: "Austria", code: "AT"}]
请注意,即使在一个列表中使用数千个这样的映射,也永远不会耗尽原子,因为
:name
:code
始终是唯一分配的两个原子(因为每个原子都是值,所以编写
:a
:a
就像编写
3
3

一旦你有了一个类似的列表,你就可以使用如下功能对其进行过滤:

def filter_by(countries, key, value) do
  Enum.filter(countries, fn(country) -> country[key] == value end)
end

filter_by(countries, :code, "AT")

钥匙只有两个原子,问题出在哪里?我建议不要过早地进行优化。您可以在代码中使用任意数量的原子,因为同一个原子总是指向同一个名称。它们是高效的,甚至对于大型数据集(如国家代码或名称)也是非常好的。唯一应该避免的是动态创建它们(例如,从用户输入),因为它们不是垃圾收集的。经过很长一段时间后,atom表将变得比内存大。永远不要害怕引入新的原子。它很便宜!害怕使用
list\u to\u atom/1
你也可以使用HashDict,这是一种类似于字典的映射,但能够处理数百万个键。同样值得注意的是,Erlang 18可能会以大地图为特色,这将使整个讨论变得毫无意义你可能还想看看这个:我现在找不到,但我可以发誓,我在Elixir文档中看到了关于何时使用哪个数据结构的讨论。你只有两个原子作为密钥,问题在哪里?我建议不要过早地进行优化。您可以在代码中使用任意数量的原子,因为同一个原子总是指向同一个名称。它们是高效的,甚至对于大型数据集(如国家代码或名称)也是非常好的。唯一应该避免的是动态创建它们(例如,从用户输入),因为它们不是垃圾收集的。经过很长一段时间后,atom表将变得比内存大。永远不要害怕引入新的原子。它很便宜!害怕使用
list\u to\u atom/1
你也可以使用HashDict,这是一种类似于字典的映射,但能够处理数百万个键。同样值得注意的是,Erlang 18可能会以大地图为特色,这将使整个讨论变得毫无意义您可能还想看看这个:我现在找不到,但我可以发誓,我在Elixir文档中看到了关于何时使用哪种数据结构的讨论。