更新时间:2022-08-22 08:28:11
6> ordsets:intersection([1,2,3,4],[3,4,5,6]). [3,4] 7> ordsets:union([1,2,3,4],[3,4,5,6]). [1,2,3,4,5,6] 8> ordsets:is_disjoint([1,2,3,4],[3,4,5,6]). false 9> ordsets:is_disjoint([1,2,3,4],[31,41,5,6]). true 10> ordsets:is_subset([1,2,3,4],[31,41,5,6]). false 11> ordsets:is_subset([1,2,3,4],[1,3]). false 12> ordsets:is_subset([1,2,3,4],[1,2,3,4,5,31]). true
这些方法的实现大同小异,都会遍历两个集合(实际上就是处理两个lists):
union([E1|Es1], [E2|_]=Set2) when E1 < E2 -> [E1|union(Es1, Set2)]; union([E1|_]=Set1, [E2|Es2]) when E1 > E2 -> [E2|union(Es2, Set1)]; % switch arguments! union([E1|Es1], [_E2|Es2]) -> %E1 == E2 [E1|union(Es1, Es2)]; union([], Es2) -> Es2; union(Es1, []) -> Es1.
add_element(E, [H|Es]) when E > H -> [H|add_element(E, Es)]; add_element(E, [H|_]=Set) when E < H -> [E|Set]; add_element(_E, [_H|_]=Set) -> Set; %E == H add_element(E, []) -> [E]. del_element(E, [H|Es]) when E > H -> [H|del_element(E, Es)]; del_element(E, [H|_]=Set) when E < H -> Set; del_element(_E, [_H|Es]) -> Es; %E == H del_element(_, []) -> [].
is_subset([E1|_], [E2|_]) when E1 < E2 -> %E1 not in Set2 false; is_subset([E1|_]=Set1, [E2|Es2]) when E1 > E2 -> is_subset(Set1, Es2); is_subset([_E1|Es1], [_E2|Es2]) -> %E1 == E2 is_subset(Es1, Es2); is_subset([], _) -> true; is_subset(_, []) -> false. %% 下面两个方法仅仅是对lists方法的简单封装 fold(F, Acc, Set) -> lists:foldl(F, Acc, Set). filter(F, Set) -> lists:filter(F, Set).
lists:usort的处理过程包含了数据排重:
1> lists:usort([2,1,3,4,2,3,8,9,a,v,c]). [1,2,3,4,8,9,a,c,v] 2> lists:usort([2,1,3,4,2,3,8,9,[a,c,q,m,x],a,v,c]). [1,2,3,4,8,9,a,c,v,[a,c,q,m,x]] 3> lists:usort([2,1,3,4,2,3,8,9,[0,c,q,m,x],a,v,c]). [1,2,3,4,8,9,a,c,v,[0,c,q,m,x]] 4> lists:usort([2,1,3,{zen},4,2,3,8,9,[0,c,q,m,x],a,v,c]). [1,2,3,4,8,9,a,c,v,{zen},[0,c,q,m,x]]
> lists:subtract("123212", "212"). %% lists:subtract(A, B) is equivalent to A -- B. "312".
不要这样做:
HugeList1 -- HugeList2
HugeSet1 = ordsets:from_list(HugeList1), HugeSet2 = ordsets:from_list(HugeList2), ordsets:subtract(HugeSet1, HugeSet2)
Set = gb_sets:from_list(HugeList2), [E || E <- HugeList1, not gb_sets:is_element(E, Set)]
HugeList1 -- [Element] %%OK