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

是否有任何标准库调用可以用来在两个数组上执行集合操作,或者自己实现这样的逻辑(最好是功能性的并且尽可能高效) ?

69015 次浏览

没有任何标准的库调用,但是您可能希望查看 迅捷库。它包含了一系列新的数组函数,包括差、交、并。

您可能希望遵循与 Objective-C 中相同的模式,因为它也缺乏这样的操作,但是有一个简单的解决方案:

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

是的,斯威夫特有 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"}

如果使用自定义结构,则需要实现 Hashable。

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

感谢 Amjad Husseini 在评论中提供的 Hashable 信息。

我所知道的最有效的方法是使用哥德尔数字。

The idea is so. Suppose you have N possible numbers and need to make sets of them. For example, N=100,000 and want to make sets like {1,2,3}, {5, 88, 19000} etc.

其思想是在内存中保留 N 个素数列表,对于给定的集合{ a,b,c,... } ,将其编码为

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

因此,将集编码为 BigNumber。使用 BigNumbers 的操作虽然比使用 Integers 的操作慢,但仍然非常快。

To unite 2 sets A, B, you take

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

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

To make the intersection you take

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

最大公约数

诸如此类。

这种编码被称为哥德尔化,你可以谷歌更多,所有的算术语言写的使用弗雷格的逻辑可以编码使用数字在这种方式。

要得到这个操作是-成员? 它很简单-

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

要得到红衣主教,就有点复杂了

CARDINAL(S) = # of prime factors in s

你把代表素数因子乘积集合的数字 S 分解,然后加上它们的指数。如果集合不允许重复,则所有的指数都为1。

快速设定操作

enter image description here

例子

let a: Set = ["A", "B"]
let b: Set = ["B", "C"]

A 和 B 的联合

let result = a.union(b)


var a2 = a
a2.formUnion(b)


//["A", "B", "C"]

对称差

let result = a.symmetricDifference(b)
//["A", "C"]

差异

let result = a.subtracting(b)
//["A"]

A 和 B 的交叉路口

let result = a.intersection(b)
//["B"]

请注意,结果顺序取决于 hash[About]