Erlang Thursday – ordsets:union/2

今天的Erlang Thursday讲的是 ordsets:union/2

ordsets:union/2 有两个有序集合类型的入参,它的输出是这两个入参合并得到的有序集合 。

1
2
3
4
5
6
7
8
9
10
11
12
SetA = ordsets:from_list([1, 1, 2, 3, 5]).
% [1,2,3,5]
SetB = ordsets:new().
% []
SetC = ordsets:from_list([3, 1, 4, 1, 5, 9]).
% [1,3,4,5,9]
SetD = ordsets:from_list([a, b, c, d, e]).
% [a,b,c,d,e]
UnionAB = ordsets:union(SetA, SetB).
% [1,2,3,5]
UnionAC = ordsets:union(SetA, SetC).
% [1,2,3,4,5,9]

因为Erlang里的字符串实际上是字符列表,我们可以从字符串产生有序集合,然后通过这个函数得到两个字符串里不重复的字符并集。

1
2
3
4
5
6
7
8
ordsets:from_list("Kermit").
% "Keimrt"
ordsets:from_list([75, 101, 114, 109, 105, 116]).
% "Keimrt"
ordsets:from_list("Mississippi").
% "Mips"
ordsets:union(ordsets:from_list("Kermit"), ordsets:from_list("Mississippi")).
% "KMeimprst"

ordsets模块也包含 ordsets:union/1 ,它的入参是一个由有序集合组成的列表,它返回的是列表里所有有序集合的并集。

1
2
3
4
5
6
7
8
UnionAC = ordsets:union([SetA, SetC]).
% [1,2,3,4,5,9]
UnionABC = ordsets:union([SetB, SetC, SetA]).
% [1,2,3,4,5,9]
UnionABCD = ordsets:union([SetB, SetC, SetA, SetD]).
% [1,2,3,4,5,9,a,b,c,d,e]
UnionCD = ordsets:union([SetC, SetD]).
% [1,3,4,5,9,a,b,c,d,e]

警告:有序集合的表现形式虽然只是一个列表,但是如果你传递一个普通列表给 ordsets:union/2 ,你将得不到你预期的结果,因为这个函数要求每个有序集合里的元素是真正的有序并且是一个集合。

1
2
3
4
5
6
7
8
ordsets:union([1, 2, 3], [a, b, c]).
% [1,2,3,a,b,c]
ordsets:union([1, 1, 2, 3, 1, 2], [a, b, c]).
% [1,1,2,3,1,2,a,b,c]
ordsets:union([1, 1, 2, 3, 1, 2], [1, a, b, c]).
% [1,1,2,3,1,2,a,b,c]
ordsets:union([1, 1, 2, 3, 1, 2], [1, a, b, c, 1]).
% [1,1,2,3,1,2,a,b,c,1]

原文链接: https://www.proctor-it.com/erlang-thursday-ordsets-union-2/