在Swift数组上设置操作(union,intersection)?

dev*_*os1 94 functional-programming set-operations swift

我是否可以使用任何标准库调用来对两个数组执行set操作,或者自己实现这样的逻辑(理想情况下尽可能功能和高效)?

joe*_*son 175

是的,斯威夫特有这个Set课程.

let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]

let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)
Run Code Online (Sandbox Code Playgroud)

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

firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Run Code Online (Sandbox Code Playgroud)

Swift 2.0可以计算数组参数:

set1.union(array2)       // {"a", "b", "c", "d"} 
set1.intersect(array2)   // {"a", "b"}
set1.subtract(array2)    // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Run Code Online (Sandbox Code Playgroud)

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

set1.union(set2)        // {"a", "b", "c", "d"}
set1.intersect(set2)    // {"a", "b"}
set1.subtract(set2)     // {"c"}
set1.exclusiveOr(set2)  // {"c", "d"}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是自定义结构,则需要实现Hashable.

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

感谢Amjad Husseini在Hashable信息的评论中.

  • 请注意,至少从Swift 2.0开始,您可以将数组作为参数传递给这些函数.因此,除了上面显示的表单之外,`set1.union(array2)`和`set1.exclusiveOr(array2)`都是合法的. (8认同)
  • @Nathan取决于设定的操作.例如,set union和set intersection是可交换和关联的,因此您可以使用迭代或链接来处理多个集合.或者您可以创建使用var args的自定义方法,例如Set union_all(...)和intersect_all(...). (2认同)

yoA*_*ex5 11

Swift 设置操作

在此输入图像描述

例子

let a: Set = ["A", "B"]
let b: Set = ["B", "C"]
Run Code Online (Sandbox Code Playgroud)

A 和 B 的并集a.union(b)

let result = a.union(b)

var a2 = a
a2.formUnion(b)

//["A", "B", "C"]
Run Code Online (Sandbox Code Playgroud)

A 和 B 的对称差a.symmetricDifference(b)

let result = a.symmetricDifference(b)
//["A", "C"]
Run Code Online (Sandbox Code Playgroud)

差异A\Ba.subtracting(b)

let result = a.subtracting(b)
//["A"]
Run Code Online (Sandbox Code Playgroud)

A 和 B 的交集a.intersection(b)

let result = a.intersection(b)
//["B"]
Run Code Online (Sandbox Code Playgroud)

请注意,结果顺序取决于哈希函数结果

[迅捷套装]