2015-02-23 40 views
3

我是Erlang的新手,所以我正在研究一个示例程序,并努力决定是使用数组还是列表。两者都很容易创建和处理,但我没有得到:Erlang数组vs列表

  • 如何将一个项目追加到数组而不知道应该追加到哪里的索引。 array:set(array:size(A),"a",A)要走的路吗?
  • 如何确定某个元素是否为数组的成员,就像lists:member()函数一样。我是否必须遍历整个数组并检查每个元素的这个?

最后,哪一个在性能方面更好?

+0

经验法则:使用列表,除非它很明显你不应该。 – zxq9 2015-02-23 15:25:36

回答

3

列表是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。上可用的数组实现此

的更多信息:https://stackoverflow.com/a/16464349/1245380

1

如果你认为你可能需要像列表的功能:成员/ 2,使用列表:O)

阵列带来的价值时通过其索引来访问任何元素是有意义的,避免列表探索或无聊的元组匹配,如{_,_,_,_,_,_,N,_,_,_,_} = Tuple,,它很好地被N = array:get(6,Array)取代。 (或者element(7,Tuple),但是元组中没有map,sparse_pap,foldl ...)。