2015-02-23 75 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 ...)。