【问题标题】:Filter two arrays Swift过滤两个数组 Swift
【发布时间】:2016-06-11 08:18:16
【问题描述】:

我有一个空数组和两个带数据的数组

var resultsArray = [String]()

var array1 = ["1","2","2","3","4"]
var array2 = ["1","2","2","3","4","5","6"]

我的目标是将resultsArrayarray2 中与array1 不匹配的元素(示例中的“5”和“6”)相附加。

最微妙的方法是什么?

谢谢。

【问题讨论】:

  • 我认为您需要更具体地说明“不匹配”的含义。您是指array2 中不在array1 中的值吗?如果array2 有三个“4”怎么办——其中两个应该进入resultsArray 还是零?或者你的意思是在同一个地方不匹配的值——所以[1, 2, 3][3, 1, 2]resultsArray 中会有 1、2 和 3?

标签: ios arrays swift filter


【解决方案1】:

使用filter 函数

var resultsArray = [String]()

let array1 = ["1","2","2","3","4"]
let array2 = ["1","2","2","3","4","5","6"]

let filteredArray = array2.filter{ !array1.contains($0) }

resultsArray.appendContentsOf(filteredArray)

如果集合包含独特的项目,请考虑使用Set 而不是Array


更新 Swift 5.1:

在 iOS 13、macOS 10.15 中有一个新的 API 在 Array

public func difference<C>(from other: C) -> CollectionDifference<Element> where C : BidirectionalCollection, Self.Element == C.Element


var resultsArray = [String]()

let array1 = ["1","2","2","3","4"]
let array2 = ["1","2","2","3","4","5","6"]

let diff = array2.difference(from: array1)
resultsArray.append(contentsOf: array1)
for change in diff {
    switch change {
    case .remove(let offset, _, _): resultsArray.remove(at: offset)
    case .insert(let offset, let element, _): resultsArray.insert(element, at: offset)
    }
}

【讨论】:

  • 这正是我一直在寻找的解决方案。谢谢,瓦迪安!
  • 应该注意,这具有 O(n^2) 的计算复杂度,如果数组变大,它可能会不必要地变慢。考虑使用 Set 而不是 contains 方法是 O(1) 而不是 O(n)
【解决方案2】:
var resultsArray: [String] = []

let arrayX = ["1","2","2","3","4"]
let arrayY = ["1","2","2","3","4","5","6","7"]

let setX = Set(arrayX), setY = Set(arrayY)

resultsArray.append(contentsOf: setY.subtracting(setX))

这个答案比使用过滤器更快。

【讨论】:

  • 希望能有一些解释
  • @Ivan 这是相同的答案,但通过集合减法完成
  • 0.00490117073059082 与 0.0463278293609619 的时间测量。我的回答更快。
  • 您需要将此添加到帖子中。如果没有解释,您需要直观地比较两个答案。
【解决方案3】:

使用过滤函数来查找两个数组中不同数量的元素

let Filter = array2.filter{!array1}
resultArray.appendContentsof(Filter)

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多