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 + -
显示快捷键?