【问题标题】:See if 2 arrays contain same element (swift 2.0)查看 2 个数组是否包含相同的元素(swift 2.0)
【发布时间】:2016-02-02 18:30:52
【问题描述】:

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

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

我想比较一下这两个数组是否包含任何相同的元素,然后将结果放入布尔数组中。比如说“array1中的第一个元素是”string1“,现在我们来看看array2中是否有任何元素与“string1”相同,如果是,则boolArray中的第一个元素为true,如果不是,它会是假的。”在这里比较 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 个。也许有一些我不知道的 swift 函数对我们有很多作用?

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    您可以使用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) }
    

    如果第二个数组是(并且元素是Hashable) 那么可能先将其转换为Set (如@matt 的回答)

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

    提高查找的性能。

    【讨论】:

    • 对于未来的访问者,这种方法也适用。我首先尝试了另一个,这就是为什么我给了它正确的答案标记(作为一个快速的新手,我更容易理解),但它的工作原理与接受的答案相同。有一个upvote :)
    • 什么时候认为数组很大?例如,是两个数组,每个数组有 30 个字符串,我应该改用集合吗?我不知道什么被认为是大的。谢谢!
    【解决方案2】:

    如果您认为任一数组中的 any 元素应与另一个数组中的 any 元素匹配,那么算法很简单:将两个数组都转换为集合并取两组的交集。结果集将是两个数组中存在的所有元素。

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

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

    【讨论】:

    • 这实际上是 swift 中的一件很酷的事情,我不知道你能做到(我将来可能会使用),但它不会直接产生一个布尔数组来指示是否或者不是每个元素在与之比较的数组中都有匹配的元素。不过谢谢!
    • 我明白这一点。 :) 我知道它不符合您的实际规格。只是想确保您知道此选项。当这是您想要回答的问题时,速度非常快。
    【解决方案3】:

    试试这个:

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

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

    【讨论】:

    • 是的,这就是我要找的。多谢!它产生一个布尔数组,指示第一个数组在第二个数组中是否有匹配的元素。
    • NP。这不是最优雅或最有效的解决方案,但使用您的原始解决方案应该可以完成工作。
    • 可以提高此答案效率的一件事是在您将 boolValue 设置为 true 之后添加 break
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2019-04-27
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多