在Swift数组上设置操作(联合,交集)?

是否有任何标准库调用可用于对两个数组执行集合操作,或者自己实现这样的逻辑(理想情况下尽可能在function上和效率上尽可能)?

是的,Swift有Set类。

 let array1 = ["a", "b", "c"] let array2 = ["a", "b", "d"] let set1:Set<String> = Set(array1) let set2:Set<String> = Set(array2) 

Swift 3.0+可以对集合进行操作:

 firstSet.union(secondSet)// Union of two sets firstSet.intersection(secondSet)// Intersection of two sets firstSet.symmetricDifference(secondSet)// exclusiveOr 

Swift 2.0可以计算数组参数:

 set1.union(array2) // {"a", "b", "c", "d"} set1.intersect(array2) // {"a", "b"} set1.subtract(array2) // {"c"} set1.exclusiveOr(array2) // {"c", "d"} 

Swift 1.2+可以在集合上计算:

 set1.union(set2) // {"a", "b", "c", "d"} set1.intersect(set2) // {"a", "b"} set1.subtract(set2) // {"c"} set1.exclusiveOr(set2) // {"c", "d"} 

感谢Michael Stern在Swift 2.0更新中的评论。

我知道的最有效的方法是使用godel数字。 Google进行godel编码。

这个想法是如此。 假设你有N个可能的数字,并且需要把它们组合起来。 例如,N = 100,000,想要制作{1,2,3},{5,88,19000}等。

这个想法是把N个素数的列表保存在内存中,对于一个给定的集合{a,b,c,…},你把它编码为

  prime[a]*prime[b]*prime[c]*... 

所以你把一个集合编码为BigNumber。 BigNumbers的操作,尽pipe比整数运算慢,但仍然非常快。

联合2组A,B,你拿

  UNITE(A, B) = lcm(a, b) 

A和B的最低公倍数为A和B为集合和两个数字。

为了使你的交点

  INTERSECT(A, B) = gcd (a, b) 

最大的公约数。

等等。

这种编码称为godelization,你可以google更多,所有使用Frege逻辑编写的算术语言都可以用这种方式编码。

要获得操作是成员? 这很简单 –

 ISMEMBER(x, S) = remainder(s,x)==0 

为了得到这个基数,这有点复杂 –

 CARDINAL(S) = # of prime factors in s 

你分解表示素数因子乘积的数S并加上它们的指数。 如果该组不允许重复,你将有所有的指数1。

没有任何标准的库调用,但是您可能需要查看ExSwift库。 它包括一系列新的函数,包括差异,交叉和联合。

您可能希望遵循与Objective-C中相同的模式,该模式也缺乏此类操作,但有一个简单的解决方法:

如何在目标C中交叉两个数组?