Erlang中文手册(Erldoc.com)  »  proplists  »  split/2
Erlang并发编程 Erlang/OTP设计原理 Erlang/OTP[pdf] Mnesia用户手册[pdf] Erlang完整手册[en] 官网手册[en] 模块列表 方法列表 随机 Erlang中文社区(BBS) 美女图库

proplists:split/2

按照键进行数据分割分组

用法:

split(List, Keys) -> {Lists, Rest}

内部实现:

-spec split(List, Keys) -> {Lists, Rest} when
      List :: [term()],
      Keys :: [term()],
      Lists :: [[term()]],
      Rest :: [term()].

split(List, Keys) ->
    {Store, Rest} = split(List, dict:from_list([{K, []} || K <- Keys]), []),
    {[lists:reverse(dict:fetch(K, Store)) || K <- Keys],
     lists:reverse(Rest)}.

split([P | Ps], Store, Rest) ->
    if is_atom(P) ->
	    case dict:is_key(P, Store) of
		true ->
		    split(Ps, dict_prepend(P, P, Store), Rest);
		false ->
		    split(Ps, Store, [P | Rest])
	    end;
       tuple_size(P) >= 1 ->
	    %% Note that Key does not have to be an atom in this case.
	    Key = element(1, P),
	    case dict:is_key(Key, Store) of
		true ->
		    split(Ps, dict_prepend(Key, P, Store), Rest);
		false ->
		    split(Ps, Store, [P | Rest])
	    end;
       true ->
	    split(Ps, Store, [P | Rest])
    end;
split([], Store, Rest) ->
    {Store, Rest}.

把列表 List 分割成一个子列表 Lists 和一个剩余元素的列表 Rest。列表 Lists 是包含 Keys 里每一个键的一个子列表,并以相应的顺序排列。在子列表里元素的相对位置顺序的保存是按照原来列表 List 里的顺序。Rest 是跟给出的键没有相关联的元素的列表,它们的保存顺序也是按照原来列表里的顺序。

proplists:split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c]).
阿里云 - 最高1000元通用代金券立即可用
沪ICP备13037221号-9