erlang的list(一)

论坛 期权论坛 脚本     
匿名技术用户   2021-1-4 19:40   70   0

之所以先从lists说起,因为大部分erlang的使用都离不开list,就连erlang中的string类型的数据其实也不过是一个list,erlang为什么对list那么情有独钟,作为一个并不深入这种语言的使用者我也说不好,不过我个人感觉,相比数组,list更方便于这种函数型语言对一个数据进行解析创建和修改,搭配于tuple(元组)也更利于一个数据的封装。

加上对于list并没有设置大小,而是随数据的增长而增长,在处理数据的时候程序员也不需要刻意的去裁定内存的问题,做个小实验,我们写一个循环数据到erlang中List

-module(test).
-export([
 test_loop/0,
 test_loop/2
]).

test_loop() ->
 TestList = [],
 test_loop(TestList, 0).
test_loop(List, N) ->
 M = N + 1,
 NewTestList = List ++ [M],
 io:format("A Simple Test:~p~n", [M]),
 test_loop(NewTestList, M).

上面的代码其实就是一个死循环,将数字从0开始递增加1作为一个元素加入到列表中(你可能要等好久才会出现内存溢出的问题)。

list中你可以增加任意的数据类型于其中,目前我所经历过的项目中多是放入元组数据,例如这样一个数据

[
{100001,100001_512,1,{954,237}},
{100002,100001_513,1,{954,237}},
{100003,100001_514,1,{954,237}},
]

这样的数据像不像我们在处理Mysql或者其他数据库时的数据项呢,大多数的数据也都是这样的固定格式的,总之我们经常会以一个key为基准,让后放入相应Value,这样很方便我们去操作,我们既不需要关心Value的内容或者格式就可以通过一个key来将其取出进行操作

下面这种格式的数据,我们只需要知道第一个键就可以取出后面的数据。

[
{a,[{1,2,3}]},
{b,3},
{c,{1,2}}
]

erlang也提供了很强大的list处理方法,我们来看一下一些小例子比较常用的lists方法,当然你可以自己打印出结果,观察他们的返回值。

-module(test).
-export([
 using_list/0
]).

using_list() ->
 List1 = [],      %%创建一个空列表List1
 io:format("the List1 of test is :~p~n",[List1]),

 List2 = List1 ++ [{1, first}, {2, second}],  %%向数组中追加新的数据
 io:format("the List2 of test is :~p~n",[List2]),

 List3 = lists:keydelete(1,1, List2),   %%根据相应位置的key值来删除元素
 io:format("the List3 of test is :~p~n",[List3]),

 ListResult1 = lists:keyfind(1,1,List3),   %%根据相应位置的key值来查找元素
 io:format("the ListResult1 of test is :~p~n",[ListResult1]),

 ListResult2 = lists:keyfind(1,2,List3),   %%根据相应位置的key值来查找元素
 io:format("the ListResult2 of test is :~p~n",[ListResult2]),

 NewTuple = {1,first},
 List4 = lists:keyreplace(2, 1, List3, NewTuple), %%根据相应位置来替换某个元素
 io:format("the List4 of test is :~p~n",[List4]).

lists的方法实现都是递归循环的,

所以尽量优化你的list格式,减少在程序中对于list的循环嵌套,

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP