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]).