看两个数组是否包含相同的元素(swift 2.0)

时间:2015-11-02 19:04:52

标签: arrays swift

我有2个字符串数组。例如,让我们这样说:

 let array1 = ["string1", "string2", "string3", "string4", "string5"]
 let array2 = ["string8", "string4", "string3", "string367", "string5"]

我想比较并查看2个数组是否包含任何相同的元素,然后将结果放入bool数组中。就像说" array1中的第一个元素是" string1",现在让我们看一下,看看array2中的任何元素是否与" string1"相同,如果他们是,boolArray中的第一个元素是真的,如果没有,它将是假的。"这里将array1与array2进行比较的结果将产生一个

的boolArray
  var boolArray = [false, false, true, true, true]

我该怎么做?我试过这个:

for y in array1 {
        for z in array2 {
            if y == z {
                self.boolArray.append(true)
            }
            else {
                self.boolArray.append(false)
            }
        }
    }

但它没有用,因为boolArray包含25个元素,它应该只包含5.也许有一些我不知道的快速函数对我们有很多这样的功能?

3 个答案:

答案 0 :(得分:22)

您可以使用map()将第一个数组的每个元素映射到布尔值, 和contains()检查第二个数组中是否包含该元素:

let array1 = ["string1", "string2", "string3", "string4", "string5"]
let array2 = ["string8", "string4", "string3", "string367", "string5"]

let boolArray = array1.map { (element) -> Bool in
    return array2.contains(element)
}
print(boolArray) // [false, false, true, true, true]

使用闭合速记语法,可以写成

let boolArray = array1.map { array2.contains($0) }

如果第二个数组 large (元素为Hashable) 然后可能有利于首先将其转换为Set (如在@ matt的回答中)

let set2 = Set(array2)
let boolArray = array1.map { set2.contains($0) }

提高查找效果。

答案 1 :(得分:14)

如果你满足于任何一个数组中的任何元素应该匹配另一个数组中的任何元素,那么算法很简单:将两个数组转换为集合并取两组的交集。结果集将是两个数组中存在的所有元素。

let array1 = ["string1", "string2", "string3", "string4", "string5"]
let array2 = ["string8", "string4", "string3", "string367", "string5"]
let result = Set(array1).intersect(Set(array2))

然而,请注意,这仅仅回答了关于元素存在的问题;它放弃了秩序的概念。

答案 2 :(得分:6)

试试这个:

2047868928 bytes (2.0 GB) copied, 2.53489 s, 808 MB/s

使用现有代码作为基线,您只想在完成迭代比较器数组(数组2)后写入布尔数组。这是一种非常迭代的方法,但应该有效。