Ham*_*ish 26
你可以通过简单地将你array2的contains函数传递给你array1的contains函数(反之亦然),就像元素一样Equatable.
let array1 = [2, 3, 4, 5]
let array2 = [20, 15, 2, 7]
// this is just shorthand for array1.contains(where: { array2.contains($0) })
if array1.contains(where: array2.contains) {
print("Array 1 and array 2 share at least one common element")
} else {
print("Array 1 doesn't contains any elements from array 2")
}
Run Code Online (Sandbox Code Playgroud)
这通过循环遍历数组1的元素来工作.对于每个元素,它将循环遍历数组2以检查它是否存在于该数组中.如果它找到该元素,它将断开并返回true - 否则为false.
这是有效的,因为实际上有两种口味contains.一个接受一个闭包,以便根据自定义谓词检查每个元素,另一个只是直接比较一个元素.在此示例中,array1使用闭包版本,并array2使用元素版本.这就是你可以将一个contains函数传递给另一个contains函数的原因.
虽然正如@AMomchilov正确指出的那样,上述算法是O(n 2).一个好的集合交集算法是O(n),因为元素查找是O(1).因此,如果您的代码对性能至关重要,那么您应该使用集合来执行此操作(如果您的元素是Hashable),如@simpleBob所示.
虽然如果你想利用contains提供给你的早期退出,你会想要做这样的事情:
extension Sequence where Iterator.Element : Hashable {
func intersects<S : Sequence>(with sequence: S) -> Bool
where S.Iterator.Element == Iterator.Element
{
let sequenceSet = Set(sequence)
return self.contains(where: sequenceSet.contains)
}
}
Run Code Online (Sandbox Code Playgroud)
if array1.intersects(with: array2) {
print("Array 1 and array 2 share at least one common element")
} else {
print("Array 1 doesn't contains any elements from array 2")
}
Run Code Online (Sandbox Code Playgroud)
这与使用数组的contains方法非常相似 - 这个arraySet.contains方法现在是O(1)的显着差异.因此,整个方法现在将在O(n)处运行(其中n是两个序列的较大长度),可能提前退出.
另一种方法是使用Set s:
let array1 = [1,2,3,4,5]
let array2 = [2,3]
let set1 = Set(array1)
let intersect = set1.intersect(array2)
if !intersect.isEmpty {
// do something with the intersecting elements
}
Run Code Online (Sandbox Code Playgroud)
使用Swift 5,您可以使用以下路径之一来查找两个数组是否具有公共元素。
Set isDisjoint(with:)方法Set有一种称为的方法isDisjoint(with:)。isDisjoint(with:)具有以下声明:
func isDisjoint(with other: Set<Element>) -> Bool
Run Code Online (Sandbox Code Playgroud)
返回一个布尔值,该值指示集合是否没有与给定序列相同的成员。
为了测试两个数组是否没有公共元素,您可以使用下面实现的Playground示例代码isDisjoint(with:):
let array1 = [1, 3, 6, 18, 24]
let array2 = [50, 100, 200]
let hasNoCommonElement = Set(array1).isDisjoint(with: array2)
print(hasNoCommonElement) // prints: true
Run Code Online (Sandbox Code Playgroud)
Set intersection(_:)方法Set有一种称为的方法intersection(_:)。intersection(_:)具有以下声明:
func intersection<S>(_ other: S) -> Set<Element> where Element == S.Element, S : Sequence
Run Code Online (Sandbox Code Playgroud)
返回一个新集合,该集合具有与此集合和给定序列共同的元素。
为了测试两个数组是否没有公共元素或一个或多个公共元素,您可以使用下面实现的Playground示例代码intersection(_:):
let array1 = [1, 3, 6, 18, 24]
let array2 = [2, 3, 18]
let intersection = Set(array1).intersection(array2)
print(intersection) // prints: [18, 3]
let hasCommonElement = !intersection.isEmpty
print(hasCommonElement) // prints: true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4167 次 |
| 最近记录: |