gpt4 book ai didi

ios - Swift - 确定 Array1 是否至少包含一个来自 Array2 的对象

转载 作者:IT王子 更新时间:2023-10-29 05:45:26 24 4
gpt4 key购买 nike

我有 2 个数组。比如,array1 = [1,2,3,4,5]array2 = [2,3]。如果 array1 至少包含 array2 中的一项,我该如何快速 checkin ?

最佳答案

您只需传入array2contains 即可完成此操作函数到您的array1contains函数(反之亦然),因为您的元素是 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")
}

这是通过遍历数组 1 的元素来实现的。对于每个元素,它将遍历数组 2 以检查它是否存在于该数组中。如果找到该元素,它将中断并返回 true - 否则返回 false。

之所以可行,是因为实际上有两种类型的 contains。一个采用闭包来根据自定义谓词检查每个元素,另一个只是直接比较元素。在此示例中,array1 使用 closure version ,并且 array2 使用 element version .这就是您可以将 contains 函数传递给另一个 contains 函数的原因。


虽然,作为correctly pointed out by @AMomchilov ,上述算法的复杂度为O(n2)。一个好的集合交集算法是 O(n),因为元素查找是 O(1)。因此,如果您的代码对性能至关重要,您绝对应该使用集合来执行此操作(如果您的元素是 Hashable),as shown by @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)
}
}

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")
}

这与使用数组的 contains 方法的工作原理非常相似——显着的区别在于 arraySet.contains 方法现在的复杂度为 O(1)。因此,整个方法现在的运行时间为 O(n)(其中 n 是两个序列中较大的长度),并有可能提前退出。

关于ios - Swift - 确定 Array1 是否至少包含一个来自 Array2 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com