|
|
- -module(utList).
-
- -define(TRUE, true).
- -define(FALSE, false).
- -define(BREAK, break).
- -define(BREAK(Value), {?BREAK, Value}).
- -define(CONTINUE, continue).
- -define(CONTINUE(Value), {?CONTINUE, Value}).
- -define(UNDEFINED, undefined).
-
- -compile([export_all, nowarn_export_all]).
-
- -spec getListVal(term(), list()) -> term().
- getListVal(Key, List) ->
- case lists:keyfind(Key, 1, List) of
- {_Key, Value} ->
- Value;
- _ ->
- undefined
- end.
-
- -spec getListVal(term(), list(), term()) -> term().
- getListVal(Key, List, Default) ->
- case lists:keyfind(Key, 1, List) of
- {_Key, Value} ->
- Value;
- _ ->
- Default
- end.
-
- while(Fun, CurData) ->
- case Fun(CurData) of
- ?BREAK -> CurData;
- ?BREAK(BreakData) -> BreakData;
- ?CONTINUE ->
- while(Fun, CurData);
- ?CONTINUE(Continue) ->
- while(Fun, Continue)
- end.
-
- %% For loop.
- for(N, Fun) ->
- for(1, N, 1, Fun).
-
- for(Start, End, Fun) ->
- for(Start, End, 1, Fun).
-
- for(End, End, _Step, Fun) ->
- Fun(End);
- for(Start, End, Step, Fun) ->
- Fun(Start),
- for(Start + Step, End, Step, Fun).
-
-
- %% 带返回状态的for循环 @return {ok, State}
- forWithState(Index, Max, _Fun, State) when Index > Max ->
- {ok, State};
- forWithState(Max, Max, Fun, State) ->
- Fun(Max, State);
- forWithState(Index, Max, Fun, State) ->
- {ok, NewState} = Fun(Index, State),
- forWithState(Index + 1, Max, Fun, NewState).
-
- forWhile(Fun, State) ->
- forWhile(?CONTINUE, Fun, State).
- forWhile(?BREAK, _Fun, State) ->
- State;
- forWhile(?CONTINUE, Fun, State) ->
- {Next, NewState} = Fun(State),
- forWhile(Next, Fun, NewState).
-
- %% 可以重复获取
- randFormList([]) ->
- false;
- randFormList(List) ->
- lists:nth(rand:uniform_s(1, length(List)), List).
-
- %% 不能重复获取
- randFormListOnce([]) ->
- {false, []};
- randFormListOnce(List) ->
- Nth = rand:uniform_s(1, length(List)),
- NthData = lists:nth(Nth, List),
- {NthData, lists:delete(NthData, List)}.
-
- randDelete(RemainList) ->
- Pos = rand:uniform_s(1, length(RemainList)),
- remove_nth(Pos, RemainList).
-
- randDelete(DelCount, List) ->
- FunDel =
- fun(_, RemainList) ->
- RemainList(RemainList)
- end,
- lists:foldl(FunDel, List, lists:seq(1, DelCount)).
-
- %%随机从集合中选出指定个数的元素length(List) >= Num
- %%[1,2,3,4,5,6,7,8,9]中选出三个不同的数字[1,2,4]
- getRandFromList(Num, List) ->
- ListSize = length(List),
- FunDel =
- fun(N, List1) ->
- Random = rand:uniform_s(1, (ListSize - N + 1)),
- Elem = lists:nth(Random, List1),
- lists:delete(Elem, List1)
- end,
- Result = lists:foldl(FunDel, List, lists:seq(1, Num)),
- List -- Result.
-
-
- %%打乱列表函数 List =[] 返回 打乱后列表 List2 元素小于300多个的时候 使用confuseList1 大于300多个的时候使用confuseList2
- %% ----------------------------------------------------
- confuseList1(List) ->
- TupleList = list_to_tuple(List),
- TupleSize = tuple_size(TupleList),
- confuseList1(TupleSize, TupleSize, TupleList).
-
- confuseList1(0, _TupleSize, TupleList) -> tuple_to_list(TupleList);
- confuseList1(Index, TupleSize, TupleList) ->
- ChangeIndex = rand:uniform(TupleSize),
- Value1 = element(Index, TupleList),
- Value2 = element(ChangeIndex, TupleList),
- TupleList1 = setelement(Index, TupleList, Value2),
- TupleList2 = setelement(ChangeIndex, TupleList1, Value1),
- confuseList1(Index - 1, TupleSize, TupleList2).
-
- confuseList2(List) ->
- Array = array:from_list(List),
- ArraySize = array:size(Array),
- confuseList2(ArraySize, ArraySize, Array).
-
- confuseList2(0, _TupleSize, TupleList) -> array:to_list(TupleList);
- confuseList2(Index, TupleSize, TupleList) ->
- ChangeIndex = rand:uniform(TupleSize),
- Value1 = array:get(Index, TupleList),
- Value2 = array:get(ChangeIndex, TupleList),
- TupleList1 = array:set(Index, Value2, TupleList),
- TupleList2 = array:set(ChangeIndex, Value1, TupleList1),
- confuseList2(Index - 1, TupleSize, TupleList2).
-
- transferMaps([], Index, Map) -> {Index - 1, Map};
- transferMaps([Element | List], Index, Map) ->
- transferMaps(List, Index + 1, Map#{Index => Element}).
-
- confuseList3(List) ->
- {Cnt, Map} = transferMaps(List, 1, #{}),
- confuseList3(Cnt, Cnt, Map).
-
- confuseList3(0, _Size, Map) -> maps:values(Map);
- confuseList3(Index, Size, Map) ->
- ChangeIndex = rand:uniform(Size),
- #{Index := Value1, ChangeIndex := Value2} = Map,
- confuseList3(Index - 1, Size, Map#{Index := Value2, ChangeIndex := Value1}).
-
- %%根数Tuple元素数量,把List转成Tuple 返回:{TupleList, RemainList}
- list_to_tuple(List, TupleCount) ->
- list_to_tuple(List, TupleCount, []).
- list_to_tuple(List, TupleCount, Result) when length(List) >= TupleCount ->
- {List1, List2} = lists:split(TupleCount, List),
- list_to_tuple(List2, TupleCount, [list_to_tuple(List1) | Result]);
- list_to_tuple(List, _TupleCount, Result) ->
- {lists:reverse(Result), List}.
-
- %%计算元素在列表中出现几次(5, [1,2,3,5,5,5,3]) ----> 3
- repeatCount(Element, List) ->
- repeatCount(Element, List, 0).
- repeatCount(Element, List, Count) ->
- case lists:member(Element, List) of
- false -> Count;
- true ->
- repeatCount(Element, lists:delete(Element, List), Count + 1)
- end.
-
- remove_nth(RemainList, Pos) ->
- Head = lists:sublist(RemainList, 1, Pos - 1),
- End = lists:sublist(RemainList, Pos + 1, length(RemainList)),
- Head ++ End.
-
- %%删除指定元素返回:(5, [1,2,4,4,5,5,4,5]) -> [1,2,4,4,4]
- remove_element(Element, List) ->
- case lists:member(Element, List) of
- false -> List;
- true -> remove_element(Element, lists:delete(Element, List))
- end.
-
- %%删除重复元素 [1,2,3,2,3,4] ---> [1,2,3,4]
- remove_repeat(List) ->
- remove_repeat(List, []).
-
- remove_repeat([], Result) ->
- Result;
- remove_repeat([L | List], Result) ->
- case lists:member(L, Result) of
- false -> remove_repeat(List, Result ++ [L]);
- true -> remove_repeat(List, Result)
- end.
-
-
- %%根据Key去查List中元素的Nth位相等的匹配到的元素Fun(Element)返回
- find_elements(Key, Nth, List, Fun) ->
- InnerFun = fun(Element) ->
- case element(Nth, Element) =:= Key of
- true ->
- {true, Fun(Element)};
- false ->
- false
- end
- end,
- lists:filtermap(InnerFun, List).
-
- %%对list进行去重,排序
- %%Replicat 0不去重,1去重
- %%Sort 0不排序,1排序
- filter_list(List, Replicat, Sort) ->
- if Replicat == 0 andalso Sort == 0 ->
- List;
- true ->
- if Replicat == 1 andalso Sort == 1 ->
- lists:usort(List);
- true ->
- if Sort == 1 ->
- lists:sort(List);
- true ->
- lists:reverse(filter_replicat(List, []))
- end
- end
- end.
-
- %%list去重
- filter_replicat([], List) ->
- List;
- filter_replicat([H | Rest], List) ->
- Bool = lists:member(H, List),
- List1 =
- if Bool == true ->
- [[] | List];
- true ->
- [H | List]
- end,
- List2 = lists:filter(fun(T) -> T =/= [] end, List1),
- filter_replicat(Rest, List2).
-
- %%交集
- get_intersection_list(A, B) when is_list(A) andalso is_list(B) ->
- lists:filter(fun(X) -> lists:member(X, A) end, B).
-
- %%并集
- get_unite_list(A, B) when is_list(A) andalso is_list(B) ->
- C = A ++ B,
- lists:usort(C).
-
- %%差集
- get_subtract_list(A, B) when is_list(A) andalso is_list(B) ->
- Insection = get_intersection_list(A, B),
- Unite = get_unite_list(A, B),
- lists:filter(fun(X) -> lists:member(X, Insection) =:= false end, Unite).
-
-
- merge(L) ->
- merge(L, []).
- merge([{Key, Value} | T], AccList) ->
- NewAccList =
- case lists:keyfind(Key, 1, AccList) of
- false ->
- [{Key, Value} | AccList];
- {Key, OldValue} ->
- lists:keyreplace(Key, 1, AccList, {Key, OldValue + Value})
- end,
- merge(T, NewAccList);
- merge([], AccList) ->
- AccList.
|