Erlang Thursday – ordsets:intersection/2

今天的Erlang Thursday继续看ordsets模块并且讲讲 ordsets:intersection/2

ordsets:intersection/2 有两个有序集合的入参,它返回的结果是两个有序集合的交集形成的新的有序集合。对于那些没有集合理论背景的人,通俗的解释就是一个集合交集就是所有相交的集合的共同元素组成的集合。

1
2
3
4
5
6
7
8
OrderedSet1 = ordsets:from_list([1, 2, 1, 3, 2, 4, 4, 9]).
[1,2,3,4,9]
OrderedSet2 = ordsets:from_list([1, 3, 5, 7, 9]).
[1,3,5,7,9]
ordsets:intersection(OrderedSet1, OrderedSet2).
[1,3,9]
ordsets:intersection(OrderedSet2, OrderedSet1).
[1,3,9]

因为 ordsets:intersection/2 在集合中找共同的元素,就向上面的例子一样,入参的顺序是可以交换的,不管两个入参的有序集合的参数顺序如何,我们得到的结果是一样的。

如果没有共同的元素,则结果是一个空的有序集合(其实就是一个空列表,上周的文章 ordsets:union/2 里强调了用一个列表来当做一个有序集合是危险的)。

1
2
3
4
5
6
7
8
Evens = ordsets:from_list(lists:seq(2, 20, 2)).
[2,4,6,8,10,12,14,16,18,20]
Odds = ordsets:from_list(lists:seq(1, 20, 2)).
[1,3,5,7,9,11,13,15,17,19]
ordsets:intersection(OrderedSet2, ordsets:new()).
[]
ordsets:intersection(Evens, Odds).
[]

Erlang也提供了 ordsets:intersection/1 函数,它的入参是一个由多个有序集合为元素组成的列表,它返回的结果是列表里所有的有序集合的交集。

1
2
3
4
5
6
7
8
9
10
OrderedSet3 = ordsets:from_list([1, 1, 2, 3, 5, 8]).
[1,2,3,5,8]
ordsets:intersection([Evens, Odds, OrderedSet1]).
[]
ordsets:intersection([Odds, OrderedSet2, OrderedSet1]).
[1,3,9]
ordsets:intersection([Evens, OrderedSet1, OrderedSet3]).
[2]
ordsets:intersection([Odds, OrderedSet1, OrderedSet3]).
[1,3]

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