当前位置: 首页 > 面试题库 >

如何在Swift中获取2数组的公共元素列表?

羊舌航
2023-03-14
问题内容

我有两个数组:

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

我如何获得这两个数组中的常见项目列表

ouptput = ["mango", "blueberry"]

我无法使用,if contains(array, string)因为我想比较2个数组。


问题答案:

您还可以结合使用filtercontains

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

// only Swift 1
let output = fruitsArray.filter{ contains(vegArray, $0) }

// in Swift 2 and above
let output = fruitsArray.filter{ vegArray.contains($0) }
// or
let output = fruitsArray.filter(vegArray.contains)

我们考虑以下代码片段:

let array1: Array = ...
let array2: Array = ...

// `Array`
let commonElements = array1.filter(array2.contains)

// vs `Set`
let commonElements = Array(Set(array1).intersection(Set(array2)))
// or (performance wise equivalent)
let commonElements: Array = Set(array1).filter(Set(array2).contains)

我用Intshort和long Strings(10到100
Characters)(全部随机生成)做了一些(人工)基准测试。我总是用array1.count == array2.count

我得到以下结果:

如果您不只critical #(number of) elements转换为a,则更Set可取

data         |  critical #elements
-------------|--------------------
         Int |        ~50
short String |       ~100
 long String |       ~200

结果说明

使用该Array方法使用“蛮力”搜索,该搜索具有时间复杂度
O(N^2)N = array1.count = array2.count而与该Set方法相反O(N)。然而从转换ArraySet和背部是这解释了增加大数据非常昂贵的`critical

elements`更大的数据类型。

结论

对于Array具有约100个元素的小s,该Array方法很好,但对于较大的s,则应使用该Set方法。

如果您想多次使用此“常见元素”运算,则建议 仅* 在可能的情况下使用Sets (元素的类型必须为)。 *Hashable

结束语

ArraySet的转换比较昂贵,而从Set到的转换Array则非常便宜。

filter与with一起使用比在以下.filter(array1.contains)情况下性能更快.filter{ array1.contains($0) }

  • 最后一个创建一个新的闭包( 仅一次 ),而第一个仅传递一个函数指针
  • 对于最后一个封闭件的调用创建花费空间和时间的附加堆栈帧( 多次O(N)


 类似资料:
  • 问题内容: 我有一个像这样的数组: 我想从该数组中获取3个随机元素。我来自C#,但是我不确定该从哪里开始。我想我应该先对数组进行随机排序,然后再从中选择前3个项目? 我尝试使用以下扩展名将其改组: 但随后在“ shuffle()”的位置说“’()’不可转换为’[Int]’”。 为了挑选一些元素,我使用: 到目前为止看起来还不错。 如何洗牌?还是有人对此有更好/更优雅的解决方案? 问题答案: Xco

  • 问题内容: 考虑以下: 如何获取列表中的元素数量? 问题答案: 该函数可以与Python中的几种不同类型一起使用-内置类型和库类型。例如: 官方2.x文档在这里: 官方3.x文档在这里:

  • 问题内容: 我有一个像下面这样的列表,其中第一个元素是id,另一个是字符串: 我只想从此元组列表创建ID列表,如下所示: 我将使用此列表,因此它必须是整数值的列表。 问题答案:

  • 问题内容: 假设我有以下代码: 我可以手动调用下一个函数多次,以使2个数组按“相同名称”分组。 问题是我不知道变量值,在这种情况下为“ dinner”和“ lunch”,因此我想按名称自动对这个statEvents数组进行分组,所以当名称不同时,我会得到尽可能多的数组。 我该怎么办? 问题答案: 从Swift 4开始,此功能已添加到标准库中。您可以这样使用它: 斯威夫特3: 不幸的是,上面的函数复

  • 问题内容: 考虑以下: 如何获取列表中的元素数量? 问题答案: 该函数可与Python中的几种不同类型一起使用-内置类型和库类型。例如: 官方2.x文档在这里: 官方3.x文档在这里:

  • 代码不止一次返回0和公共数字。我想让它返回一个数组与公共数字一次!那么,如何返回一个数组,数组中的数字对两个数组都是通用的。我想返回{2,7,4}-类似这样的东西。当我试图返回数组时,我总是出现越界异常。谢谢,巴里