Erlang 数组与列表
Erlang array vs list
我是 Erlang 的新手,所以我正在编写一个示例程序,并且正在努力决定我应该使用数组还是列表。两者都很容易创建和处理,但我没有得到:
- 如何在不知道应追加位置的索引的情况下将项目追加到数组。
array:set(array:size(A),"a",A)
是正确的选择吗?
- 如何找出某个元素是否是数组的成员,就像
lists:member()
函数一样。我是否必须遍历整个数组并为此检查每个元素?
最后,哪个性能更好?
列表是 Erlang VM 原生的数据类型。数组被实现为嵌套元组的结构。
列表可用于模式匹配。数组不应该。
正如@zxq9 提到的,除非很明显你不应该使用列表,否则应该使用列表。我认为你应该使用数组的唯一一次是在对集合执行大量随机更新时。否则只需使用列表。
- 正如您所提到的,可以使用
array:set(array:size(A),"a",A)
向数组追加。可以使用 ["a"|A]
添加到列表中。当然,如果你想追加到列表中,你可以 运行 lists:reverse
然后是 ["a"|A]
然后再调用 lists:reverse
.
- 要检查某个项目是否存在于数组中,您可以将数组转换为列表 (
array:sparse_to_list(A)
)。然后在结果列表上调用 lists:member/2
。
此处提供了有关数组实现的更多信息:
如果您认为您可能需要像列表这样的函数:member/2,请使用列表:o)
数组在通过其索引访问任何元素有意义时带来价值,避免列表探索或无聊的元组匹配,如 {_,_,_,_,_,_,N,_,_,_,_} = Tuple,
被 N = array:get(6,Array)
很好地取代。 (或 element(7,Tuple)
,但对于元组,您没有 map、sparse_pap、foldl ...)。
我是 Erlang 的新手,所以我正在编写一个示例程序,并且正在努力决定我应该使用数组还是列表。两者都很容易创建和处理,但我没有得到:
- 如何在不知道应追加位置的索引的情况下将项目追加到数组。
array:set(array:size(A),"a",A)
是正确的选择吗? - 如何找出某个元素是否是数组的成员,就像
lists:member()
函数一样。我是否必须遍历整个数组并为此检查每个元素?
最后,哪个性能更好?
列表是 Erlang VM 原生的数据类型。数组被实现为嵌套元组的结构。
列表可用于模式匹配。数组不应该。
正如@zxq9 提到的,除非很明显你不应该使用列表,否则应该使用列表。我认为你应该使用数组的唯一一次是在对集合执行大量随机更新时。否则只需使用列表。
- 正如您所提到的,可以使用
array:set(array:size(A),"a",A)
向数组追加。可以使用["a"|A]
添加到列表中。当然,如果你想追加到列表中,你可以 运行lists:reverse
然后是["a"|A]
然后再调用lists:reverse
. - 要检查某个项目是否存在于数组中,您可以将数组转换为列表 (
array:sparse_to_list(A)
)。然后在结果列表上调用lists:member/2
。
此处提供了有关数组实现的更多信息:
如果您认为您可能需要像列表这样的函数:member/2,请使用列表:o)
数组在通过其索引访问任何元素有意义时带来价值,避免列表探索或无聊的元组匹配,如 {_,_,_,_,_,_,N,_,_,_,_} = Tuple,
被 N = array:get(6,Array)
很好地取代。 (或 element(7,Tuple)
,但对于元组,您没有 map、sparse_pap、foldl ...)。