Functional programming 在Swift数组上设置操作(并集、交集)?
是否有任何标准库调用可用于在两个阵列上执行set操作,或自己实现此类逻辑(理想情况下是在功能上尽可能有效)?没有任何标准库调用,但您可能希望查看库。它在数组上包含了一系列新函数,包括差分、交集和并集。您可能希望遵循与Objective-C中相同的模式,Objective-C中也缺少此类操作,但有一个简单的解决方法:Functional programming 在Swift数组上设置操作(并集、交集)?,functional-programming,swift,set-operations,Functional Programming,Swift,Set Operations,是否有任何标准库调用可用于在两个阵列上执行set操作,或自己实现此类逻辑(理想情况下是在功能上尽可能有效)?没有任何标准库调用,但您可能希望查看库。它在数组上包含了一系列新函数,包括差分、交集和并集。您可能希望遵循与Objective-C中相同的模式,Objective-C中也缺少此类操作,但有一个简单的解决方法: 是的,Swift设置了类 let array1 = ["a", "b", "c"] let array2 = ["a", "b", "d"] let set1:Set<Str
是的,Swift设置了
类
let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]
let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)
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)在评论中提供的哈希信息。我知道的最有效的方法是使用戈德尔数。谷歌为戈德尔编码
想法是这样的。假设您有N个可能的数字,并且需要对它们进行设置。例如,N=100000并希望生成像{1,2,3}、{5,88,19000}等的集合
其思想是将N个素数的列表保存在内存中,对于给定的集合{a,b,c,…},将其编码为
prime[a]*prime[b]*prime[c]*...
所以你把一个集合编码成一个大数字。尽管大数运算比整数运算慢,但大数运算仍然非常快
要联合2组A、B,你需要
UNITE(A, B) = lcm(a, b)
A和B的最低公倍数为A和B的集合和两个数字
在你走的十字路口
INTERSECT(A, B) = gcd (a, b)
最大公约数
等等
这种编码被称为godelization,你可以在谷歌上搜索更多信息,所有使用弗雷格逻辑编写的算术语言都可以通过这种方式使用数字进行编码
要获取该操作,是否为成员?很简单——
为了得到红衣主教,这有点复杂--
分解表示素数因子乘积集合的数S,并添加它们的指数。如果集合不允许重复,您将拥有所有的指数1。如果您想自己实现集合,可以在字典上实现。@CodaFi您的意思是使用键来确保唯一性吗?您可以使用“dictionary”吗?注意:对于Swift 1.x,我一直在使用ExSwift,没有问题,但对于Swift来说,它似乎已经崩溃了2.x,并且在撰写本文时,已经有几个月没有更新了。有大量的fork可能会受到更多的关注。请注意,至少从Swift 2.0开始,您可以将数组作为参数传递给这些函数。因此,set1.union(array2)
和set1.exclusiveOr(array2)
都是合法的,除了上面显示的形式之外。如果要将5个数组相交,该怎么办?还是6号?如果数组的数量未知怎么办?@Nathan取决于set操作。例如,集合并集和集合交集是可交换和关联的,因此可以通过使用迭代或链接来处理多个集合。或者,您可以创建使用var args的自定义方法,例如Set union_all(…)和intersect_all(…)。如果数组包含重复值,例如确定$0是否为$1的字谜,其中输入字符可能有重复的字母?如果使用自定义结构,则必须符合Hashable,如果你有一个复杂的结构,这可能会很烦人
INTERSECT(A, B) = gcd (a, b)
ISMEMBER(x, S) = remainder(s,x)==0
CARDINAL(S) = # of prime factors in s