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

iOS*_*iOS 8 arrays arraylist ios swift

我有2个阵列.说,array1 = [1,2,3,4,5]array2 = [2,3].如果array1包含至少一个项目,我怎么能检查swift array2

Ham*_*ish 26

你可以通过简单地将你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")
}
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是两个序列的较大长度),可能提前退出.


Dan*_*iel 9

另一种方法是使用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)

  • 这可能是最好的方法。O(n)与O(n ^ 2) (2认同)

Ima*_*tit 7

使用Swift 5,您可以使用以下路径之一来查找两个数组是否具有公共元素。


#1 使用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)

#2。使用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)