【问题标题】:How to get list of different (un-common) items of 2 arrays in Swift如何在 Swift 中获取 2 个数组的不同(不常见)项的列表
【发布时间】:2015-09-10 12:20:30
【问题描述】:

这个问题类似于my other one

我有 2 个数组:

fruitsArray = ["apple", "mango", "blueberry", "orange"]
vegArray = ["tomato", "potato", "mango", "blueberry"]

vegArray相比,如何获得fruitsArray的不常见元素

Expected Output = ["apple", orange]

【问题讨论】:

    标签: ios arrays swift


    【解决方案1】:

    将数组转换为 Set 并使用 subtract() 函数得到你想要的

       let fruitsArray = ["apple", "mango", "blueberry", "orange"]
       let vegArray = ["tomato", "potato", "mango", "blueberry"]
    
       let set1 = Set(fruitsArray)
       let set2 = Set(vegArray)
    
       let filter = Array(set1.subtract(set2))
       println(filter) //[apple, orange]
    

    【讨论】:

    • 对于 Swift 4.2,我不得不像这样使用“减法”而不是“减法”: let filter = Array(set1.subtracting(set2))
    【解决方案2】:

    一行

    let fruitsArray = ["apple", "mango", "blueberry", "orange"]
    let vegArray = ["tomato", "potato", "mango", "blueberry"]
    
    let answer = fruitsArray.filter{ item in !vegArray.contains(item) }
    
    print("\(answer)") //  ["apple", "orange"] 
    

    【讨论】:

      【解决方案3】:

      这个操作实际上有几个困难。首先,您可能要求的两件事之间存在差异:“差异”或“减法”。差异将返回不在两个数组中的元素,例如:

      let fruitsArray = ["apple", "mango", "blueberry", "orange"]
      let vegArray = ["tomato", "potato", "mango", "blueberry"]
      
      difference(fruitsArray, vegArray) // ["apple", "orange", "tomato", "blueberry"]
      

      这似乎不是您想要的,但值得牢记。

      第二个是“减法”,它会产生您预期的结果。关于这一点,还有一件事要记住。明显的单线:

      fruitsArray.filter{ !vegArray.contains($0) }
      // ["apple", "orange"]
      

      是二次的。如果性能不重要,则没有问题,但使用Set 很容易避免。现在,您可以转换两者,并使用普通的Set 方法,但这是不必要的。转换为 Set 是 O(n) (我想,我不确定),但无论如何你都必须遍历 fruitsArray 的集合,并将其转换回结尾。 Set 的唯一优点是它有一个 O(1) contains 方法 - 所以你只需要转换你正在使用的 contains 。我认为最有效的方法是:

      let vSet = Set(vegArray)
      fruitsArray.filter { m in !vSet.contains(m) }
      

      【讨论】:

        【解决方案4】:

        功能强大的单线:

        // Swift 1.2
        let differenceResult = fruitsArray.filter({!contains(vegArray, $0)})
        
        // Swift 2.0
        let differenceResult = fruitsArray.filter(!vegArray.contains)
        

        显然对于您的其他问题,只需删除 !:

        // Swift 1.2
        let intersectionResult = fruitsArray.filter({contains(vegArray, $0)})
        
        // Swift 2.0
        let intersectionResult = fruitsArray.filter(vegArray.contains)
        

        【讨论】:

          猜你喜欢
          • 2015-12-03
          • 2020-08-23
          • 1970-01-01
          • 2016-07-06
          • 2021-09-24
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          相关资源
          最近更新 更多