lists.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,008 行 · 第 1/5 页

ERL
2,008
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id $%%-module(lists).-export([append/2, append/1, subtract/2, reverse/1,	 nth/2, nthtail/2, prefix/2, suffix/2, last/1, 	 seq/2, seq/3, sum/1, duplicate/2, min/1, max/1, sublist/2, sublist/3,	 delete/2,	 unzip/1, unzip3/1, zip/2, zip3/3, zipwith/3, zipwith3/4,	 sort/1, merge/1, merge/2, rmerge/2, merge3/3, rmerge3/3,	 usort/1, umerge/1, umerge3/3, umerge/2, rumerge3/3, rumerge/2,	 concat/1, flatten/1, flatten/2, flat_length/1, flatlength/1,	 keydelete/3, keyreplace/4,	 keysort/2, keymerge/3, rkeymerge/3, rukeymerge/3, 	 ukeysort/2, ukeymerge/3, keymap/3, keymap/4]).%% Bifs: member/2, reverse/2%% Bifs: keymember/3, keysearch/3-export([merge/3, rmerge/3, sort/2, umerge/3, rumerge/3, usort/2]).-export([all/2,any/2,map/2,flatmap/2,foldl/3,foldr/3,filter/2,	 partition/2,zf/2,	 mapfoldl/3,mapfoldr/3,foreach/2,takewhile/2,dropwhile/2,splitwith/2,	 split/2]).-export([all/3,any/3,map/3,flatmap/3,foldl/4,foldr/4,filter/3,zf/3,	 mapfoldl/4,mapfoldr/4,foreach/3]).-deprecated([{keymap,4},{all,3},{any,3},{map,3},{flatmap,3},{foldl,4},             {foldr,4},{filter,3},{mapfoldl,4},{mapfoldr,4},{foreach,3}]).%% member(X, L) -> (true | false)%%  test if X is a member of the list L%%  Now a BIF!%member(X, [X|_]) -> true;%member(X, [_|Y]) ->%	member(X, Y);%member(X, []) -> false.%% append(X, Y) appends lists X and Yappend(L1, L2) -> L1 ++ L2.%% append(L) appends the list of lists Lappend([E]) -> E;append([H|T]) -> H ++ append(T);append([]) -> [].%% subtract(List1, List2) subtract elements in List2 form List1.subtract(L1, L2) -> L1 -- L2.%% reverse(L) reverse all elements in the list L. Is now a BIF!reverse([] = L) ->    L;reverse([_] = L) ->    L;reverse([A, B]) ->    [B, A];reverse([A, B | L]) ->    lists:reverse(L, [B, A]).%reverse([H|T], Y) ->%    reverse(T, [H|Y]);%reverse([], X) -> X.%% nth(N, L) returns the N`th element of the list L%% nthtail(N, L) returns the N`th tail of the list Lnth(1, [H|_]) -> H;nth(N, [_|T]) when N > 1 ->    nth(N - 1, T).nthtail(1, [_|T]) -> T;nthtail(N, [_|T]) when N > 1 ->    nthtail(N - 1, T);nthtail(0, L) when is_list(L) -> L.%% prefix(Prefix, List) -> (true | false)prefix([X|PreTail], [X|Tail]) ->    prefix(PreTail, Tail);prefix([], List) when is_list(List) -> true;prefix([_|_], List) when is_list(List) -> false.%% suffix(Suffix, List) -> (true | false)suffix(Suffix, Suffix) when is_list(Suffix) -> true;suffix(Suffix, [_|Tail]) ->    suffix(Suffix, Tail);suffix(Suffix, []) when is_list(Suffix) -> false.%% last(List) returns the last element in a list.last([E|Es]) -> last(E, Es).last(_, [E|Es]) -> last(E, Es);last(E, []) -> E.%% seq(Min, Max) -> [Min,Min+1, ..., Max]%% seq(Min, Max, Incr) -> [Min,Min+Incr, ..., Max]%%  returns the sequence Min..Max%%  Min <= Max and Min and Max must be integersseq(Min, Max) when is_integer(Min), is_integer(Max), Min =< Max ->     seq(Min, Max, 1, []).seq(Min, Max, Incr) when Min =< Max, Incr > 0 ->    seq(Min, Min + ((Max-Min) div Incr) * Incr, Incr, []);seq(Min, Max, Incr) when Min >= Max, Incr < 0 ->    seq(Min, Min + ((Max-Min) div Incr) * Incr, Incr, []);seq(M, M, 0) when is_integer(M) ->    [M].seq(Min, Min, _, L) -> [Min|L];seq(Min, Max, I, L) -> seq(Min, Max-I, I, [Max|L]).%% sum(L) suns the sum of the elements in Lsum(L)          -> sum(L, 0).sum([H|T], Sum) -> sum(T, Sum + H);sum([], Sum)    -> Sum.%% duplicate(N, X) -> [X,X,X,.....,X]  (N times)%%   return N copies of Xduplicate(N, X) when is_integer(N), N >= 0 -> duplicate(N, X, []).duplicate(0, _, L) -> L;duplicate(N, X, L) -> duplicate(N-1, X, [X|L]).%% min(L) -> returns the minimum element of the list Lmin([H|T]) -> min(T, H).min([H|T], Min) when H < Min -> min(T, H);min([_|T], Min)              -> min(T, Min);min([],    Min)              -> Min. %% max(L) -> returns the maximum element of the list Lmax([H|T]) -> max(T, H).max([H|T], Max) when H > Max -> max(T, H);max([_|T], Max)              -> max(T, Max);max([],    Max)              -> Max.%% sublist(List, Start, Length)%%  Returns the sub-list starting at Start of length Length.sublist(List, S, L) when is_integer(L), L >= 0 ->    sublist(nthtail(S-1, List), L).sublist(List, L) when is_integer(L), is_list(List) ->    sublist_2(List, L).sublist_2([H|T], L) when L > 0 ->    [H|sublist_2(T, L-1)];sublist_2(_, 0) ->    [];sublist_2(List, L) when is_list(List), L > 0 ->    [].%% delete(Item, List) -> List'%%  Delete the first occurance of Item from the list L.delete(Item, [Item|Rest]) -> Rest;delete(Item, [H|Rest]) ->    [H|delete(Item, Rest)];delete(_, []) -> [].%% Return [{X0, Y0}, {X1, Y1}, ..., {Xn, Yn}] for lists [X0, X1, ...,%% Xn] and [Y0, Y1, ..., Yn].zip([X | Xs], [Y | Ys]) -> [{X, Y} | zip(Xs, Ys)];zip([], []) -> [].%% Return {[X0, X1, ..., Xn], [Y0, Y1, ..., Yn]}, for a list [{X0, Y0},%% {X1, Y1}, ..., {Xn, Yn}].unzip(Ts) -> unzip(Ts, [], []).unzip([{X, Y} | Ts], Xs, Ys) -> unzip(Ts, [X | Xs], [Y | Ys]);unzip([], Xs, Ys) -> {reverse(Xs), reverse(Ys)}.%% Return [{X0, Y0, Z0}, {X1, Y1, Z1}, ..., {Xn, Yn, Zn}] for lists [X0,%% X1, ..., Xn], [Y0, Y1, ..., Yn] and [Z0, Z1, ..., Zn].zip3([X | Xs], [Y | Ys], [Z | Zs]) -> [{X, Y, Z} | zip3(Xs, Ys, Zs)];zip3([], [], []) -> [].%% Return {[X0, X1, ..., Xn], [Y0, Y1, ..., Yn], [Z0, Z1, ..., Zn]}, for%% a list [{X0, Y0, Z0}, {X1, Y1, Z1}, ..., {Xn, Yn, Zn}].unzip3(Ts) -> unzip3(Ts, [], [], []).unzip3([{X, Y, Z} | Ts], Xs, Ys, Zs) ->    unzip3(Ts, [X | Xs], [Y | Ys], [Z | Zs]);unzip3([], Xs, Ys, Zs) ->    {reverse(Xs), reverse(Ys), reverse(Zs)}.%% Return [F(X0, Y0), F(X1, Y1), ..., F(Xn, Yn)] for lists [X0, X1, ...,%% Xn] and [Y0, Y1, ..., Yn].zipwith(F, [X | Xs], [Y | Ys]) -> [F(X, Y) | zipwith(F, Xs, Ys)];zipwith(F, [], []) when is_function(F, 2) -> [].%% Return [F(X0, Y0, Z0), F(X1, Y1, Z1), ..., F(Xn, Yn, Zn)] for lists%% [X0, X1, ..., Xn], [Y0, Y1, ..., Yn] and [Z0, Z1, ..., Zn].zipwith3(F, [X | Xs], [Y | Ys], [Z | Zs]) ->    [F(X, Y, Z) | zipwith3(F, Xs, Ys, Zs)];zipwith3(F, [], [], []) when is_function(F, 3) -> [].%% sort(List) -> L%%  sorts the list Lsort([X, Y | L] = L0) when X =< Y ->    case L of	[] -> 	    L0;	[Z] when Y =< Z ->	    L0;	[Z] when X =< Z ->	    [X, Z, Y];	[Z] ->	    [Z, X, Y];	_ when X == Y ->	    sort_1(Y, L, [X]);	_ ->	    split_1(X, Y, L, [], [])    end;sort([X, Y | L]) ->    case L of	[] ->	    [Y, X];	[Z] when X =< Z ->	    [Y, X | L];	[Z] when Y =< Z ->	    [Y, Z, X];	[Z] ->	    [Z, Y, X];	_ ->	    split_2(X, Y, L, [], [])    end;sort([_] = L) ->    L;sort([] = L) ->    L.sort_1(X, [Y | L], R) when X == Y ->    sort_1(Y, L, [X | R]);sort_1(X, [Y | L], R) when X < Y ->    split_1(X, Y, L, R, []);sort_1(X, [Y | L], R) ->    split_2(X, Y, L, R, []);sort_1(X, [], R) ->    lists:reverse(R, [X]).%% merge(List) -> L%%  merges a list of sorted listsmerge(L) ->    mergel(L, []).%% merge3(X, Y, Z) -> L%%  merges three sorted lists X, Y and Zmerge3(L1, [], L3) ->   merge(L1, L3);merge3(L1, L2, []) ->   merge(L1, L2);merge3(L1, [H2 | T2], [H3 | T3]) ->   lists:reverse(merge3_1(L1, [], H2, T2, H3, T3), []).%% rmerge3(X, Y, Z) -> L%%  merges three reversed sorted lists X, Y and Zrmerge3(L1, [], L3) ->   rmerge(L1, L3);rmerge3(L1, L2, []) ->   rmerge(L1, L2);rmerge3(L1, [H2 | T2], [H3 | T3]) ->   lists:reverse(rmerge3_1(L1, [], H2, T2, H3, T3), []).%% merge(X, Y) -> L%%  merges two sorted lists X and Ymerge(T1, []) ->    T1;merge(T1, [H2 | T2]) ->    lists:reverse(merge2_1(T1, H2, T2, []), []).%% rmerge(X, Y) -> L%%  merges two reversed sorted lists X and Y%% reverse(rmerge(reverse(A),reverse(B))) is equal to merge(I,A,B).rmerge(T1, []) ->    T1;rmerge(T1, [H2 | T2]) ->    lists:reverse(rmerge2_1(T1, H2, T2, []), []).%% concat(L) concatinate the list representation of the elements%%  in L - the elements in L can be atoms, integers of strings.%%  Returns a list of characters.concat(List) ->    flatmap(fun thing_to_list/1, List).thing_to_list(X) when is_integer(X) -> integer_to_list(X);thing_to_list(X) when is_float(X)   -> float_to_list(X);thing_to_list(X) when is_atom(X)    -> atom_to_list(X);thing_to_list(X) when is_list(X)    -> X.	%Assumed to be a string%% flatten(List)%% flatten(List, Tail)%%  Flatten a list, adding optional tail.flatten(List) when is_list(List) ->    do_flatten(List, []).flatten(List, Tail) when is_list(List), is_list(Tail) ->    do_flatten(List, Tail).do_flatten([H|T], Tail) when is_list(H) ->    do_flatten(H, do_flatten(T, Tail));do_flatten([H|T], Tail) ->    [H|do_flatten(T, Tail)];do_flatten([], Tail) ->    Tail.%% flat_length(List) (undocumented can be removed later)%%  Calculate the length of a list of lists.flat_length(List) -> flatlength(List).%% flatlength(List)%%  Calculate the length of a list of lists.flatlength(List) ->    flatlength(List, 0).flatlength([H|T], L) when is_list(H) ->    flatlength(H, flatlength(T, L));flatlength([_|T], L) ->    flatlength(T, L + 1);flatlength([], L) -> L.%% keymember(Key, Index, [Tuple]) Now a BIF!%% keysearch(Key, Index, [Tuple]) Now a BIF!%% keydelete(Key, Index, [Tuple])%% keyreplace(Key, Index, [Tuple], NewTuple)%% keysort(Index, [Tuple])%% keymerge(Index, [Tuple], [Tuple])%% ukeysort(Index, [Tuple])%% ukeymerge(Index, [Tuple], [Tuple])%% keymap(Function, Index, [Tuple])%% keymap(Function, ExtraArgs, Index, [Tuple])%keymember(K,N,L) when is_integer(N), N > 0 ->%    keymember3(K,N,L).%keymember3(Key, N, [T|Ts]) when element(N, T) == Key -> true;%keymember3(Key, N, [T|Ts]) ->%    keymember3(Key, N, Ts);%keymember3(Key, N, []) -> false.%keysearch(K,N,L) when is_integer(N), N > 0 ->%    keysearch3(K,N,L).%keysearch3(Key, N, [H|T]) when element(N, H) == Key ->%    {value, H};%keysearch3(Key, N, [H|T]) ->%    keysearch3(Key, N, T);%keysearch3(Key, N, []) -> false.keydelete(K,N,L) when is_integer(N), N > 0 ->    keydelete3(K,N,L).keydelete3(Key, N, [H|T]) when element(N, H) == Key -> T;keydelete3(Key, N, [H|T]) ->    [H|keydelete3(Key, N, T)];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?