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

joe*_*oey 9 arrays swift

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

 let array1 = ["string1", "string2", "string3", "string4", "string5"]
 let array2 = ["string8", "string4", "string3", "string367", "string5"]
Run Code Online (Sandbox Code Playgroud)

我想比较并查看2个数组是否包含任何相同的元素,然后将结果放入bool数组中.就像说"array1中的第一个元素是"string1",现在让我们看看array2中的任何元素是否与"string1"相同,如果它们是,则boolArray中的第一个元素将为true,如果不是,则为将是假的." 执行此操作以将array1与array2进行比较的结果将产生boolArray

  var boolArray = [false, false, true, true, true]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我试过这个:

for y in array1 {
        for z in array2 {
            if y == z {
                self.boolArray.append(true)
            }
            else {
                self.boolArray.append(false)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*n R 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]
Run Code Online (Sandbox Code Playgroud)

使用闭包简写语法,可以写成

let boolArray = array1.map { array2.contains($0) }
Run Code Online (Sandbox Code Playgroud)

如果第二个数组很大(并且元素是Hashable)那么将它转换为第一个可能是有利的Set(如在@ matt的答案中)

let set2 = Set(array2)
let boolArray = array1.map { set2.contains($0) }
Run Code Online (Sandbox Code Playgroud)

增加查找的性能.


mat*_*att 14

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

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

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

  • 我明白那个.:)我知道它不符合你的实际规格.只是想确保你知道这个选项.当你想要回答这个问题时,这是非常快的. (3认同)

Dan*_*Dan 6

试试这个:

for y in array1 {
        self.boolValue = false
        for z in array2 {
            if y == z {
                    self.boolValue = true
            }
        }
        self.boolArray.append(self.boolValue)
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 可以提高这个答案效率的一件事是在你将boolValue设置为true之后添加<code> break </ code> (4认同)