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