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

2023-11-21

我有两个数组:

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

我怎样才能获得这两个数组中的常见项目列表

ouptput = ["mango", "blueberry"]

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


您还可以使用filter and contains结合起来:

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)

Set vs Array用于公共元素的单次计算

我们考虑以下代码片段:

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)

我做了一些(人工)基准测试Int和短/长String秒(10 至 100Characters)(全部随机生成)。我总是用array1.count == array2.count

我得到以下结果:

如果您有超过critical #(number of) elements转换为Set更可取

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

结果解释

使用Array方法使用“蛮力”搜索,其中有时间复杂度 O(N^2) where N = array1.count = array2.count这与Set方法O(N)。然而,转换自Array to Set对于大数据来说,返回非常昂贵,这解释了critical #elements对于更大的数据类型。


结论

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

如果你想多次使用这个“通用元素”操作,建议使用Sets only如果可能的话(元素的类型必须是Hashable).

最后的评论

转换自Array to Set有点昂贵,而从Set to Array相比之下非常便宜。

Using filter with .filter(array1.contains)性能方面比.filter{ array1.contains($0) } since:

  • 最后一个创建了一个新的闭包(只有一次) 而第一个仅传递函数指针
  • 对于最后一个,闭包的调用会创建一个额外的堆栈帧,这会消耗空间和时间(多次: O(N))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中获取 2 个数组的公共元素列表? 的相关文章

随机推荐

  • 为什么 Num 可以像 Fractional 一样?

    正如预期的那样 这工作得很好 foo Fractional a gt a foo undefined datum bar Num a gt a gt a bar a undefined function baz Fractional a g
  • 如何在 Fancybox 的 onComplete 事件中使用 $(this) ?

    我正在尝试使用 jQuery this Fancybox 里面onComplete事件 但我遇到了麻烦 这是我的 JavaScript 代码 a iframe fancybox centerOnScroll true onComplete
  • awk 将记录分隔符 (RS) 更改为每 2 行

    我想知道如何使用 awk 处理每两行数据而不是每一行数据 默认情况下 记录分隔符 RS 设置为每个新行 如何将其更改为每 2 行 这取决于您想要实现的目标 但一种方法是使用getline操作说明 对于每一行 读取下一行并将其保存在变量中 所
  • 如何在 Ant 目标中使用文件大小

    我目前正在用 Ant 构建脚本替换我的自制构建脚本 现在我需要用特定文件的大小替换各种标记 我知道如何通过以下方式获取大小 以字节为单位
  • Android:完成应用程序/活动后显示吐司

    我想在退出应用程序时显示一个简单的吐司 问题是 吐司没有显示 我认为这是因为活动已完成或因为System exit 0 但我不知道如何解决 有人有提示吗 谢谢 在我的活动中 我有以下代码 Toast makeText this Exit a
  • 子进程中“shell=True”的实际含义

    我正在调用不同的进程subprocess模块 不过 我有一个问题 在下面的代码中 callProcess subprocess Popen ls l shell True and callProcess subprocess Popen l
  • Ajax / Jquery 自动完成 JSON 数据

    我正在尝试设置 Jquery UI 自动完成字段以获取来自 ajax 连接的数据 到目前为止 这是我的代码 mainIngredientAutoComplete autocomplete source function request re
  • Antora顶部导航栏定制

    我的问题很简单 尽管我在文档中找不到任何指向它的内容 我正在使用 Antora 中的默认生成器为项目生成文档 但我不知道如何自定义顶部导航栏 右侧的项目 这些项目有一些默认值 既然网站已生成 我应该在哪里更改或如何更改这些项目 我不想在那里
  • 原始类型的 Objective-c 属性

    在 Objective C 中 为原始类型指定一个属性是否有意义 nonatomic 我想知道这两个属性之间的区别 property nonatomic BOOL myBool property BOOL myBool 从技术上讲 答案是肯
  • 计算两行之间的时间差

    我有一个包含 StartDate 列的表 我想计算两个连续记录之间的时间差 Thanks Mark Byers 和 Yahia 我有请求表作为 requestId startdate requestId startdate 1 2011 1
  • 使用完整网址时 PHP file_get_contents 非常慢

    我正在使用一个脚本 最初不是我创建的 该脚本从 HTML 页面生成 pdf 文件 问题是现在需要很长的时间来处理 比如 1 2 分钟 据说这最初工作得很好 但在过去几周内速度减慢了 该脚本调用file get contents在 php 脚
  • 用户与 uiview 和动画完成块的交互

    我有以下代码 UIView animateWithDuration 2 0 delay 0 0 options UIViewAnimationOptionAllowUserInteraction animations imageView b
  • 500内部服务器错误,如何调试[重复]

    这个问题在这里已经有答案了 我的 POST 请求出现内部服务器错误 我该如何调试它们 是在 php ini 中设置的吗 该文件非常大 并且多次出现 错误 一词 您可以使用以下命令打开 PHP 错误error reporting error
  • 如何在 angularJS 中将 X-Frame-Options 设置为响应标头?

    我在 API 的响应中收到了 X Frame Options 标头 但据我了解 为了防止点击劫持攻击 我需要将其添加到 UI 代码中 UI代码 用angularjs编写 部署在Tomcat 版本7 0 72 服务器中 我尝试在应用程序的 w
  • 一个动态规划问题

    谁能帮我找到一个最佳的动态规划算法这个问题 在去吃晚饭的路上 CCC 的参赛者正在排队享用美味的炸薯条 N 1 N 100 名选手排成一队进入食堂 CCC 的负责人 V 博士在最后一刻意识到 程序员只是讨厌站在使用不同语言的程序员旁边 值得
  • GraphQL 枚举类型会自动解析它们的值吗?

    我应该期望枚举类型自动解析还是这些类型仅存在以限制选项 给定以下 GraphQL 架构 type Job description String status Status enum Status PENDING REVIEW PENDING
  • 如何在 Game Center 中接受邀请

    我正在尝试通过游戏中心实施邀请 但有一点我不明白 好的 我已从一台设备向另一台设备发送了邀请 然后我在接收器上有一个 UIAlertView 询问我是否愿意接受或拒绝邀请 当我接受它时 它的处理方式如下 GKMatchmaker share
  • Bootstrap xs 列换行

    对于最小的 xs 尺寸 即使我的列加起来为 12 如果屏幕宽度减小到超过一定限制 它们也不会按预期工作 例如 div class container div class row div class col xs 2 div div clas
  • 如何使用 igraph 获取最短路径上的顶点?

    我在用着igraph生成顶点对之间最短路径距离的矩阵 但我不知道如何返回顶点 到目前为止我有 path length matrix ig graph shortest paths dijkstra None None distance AL
  • 如何在 Swift 中获取 2 个数组的公共元素列表?

    我有两个数组 fruitsArray apple mango blueberry orange vegArray tomato potato mango blueberry 我怎样才能获得这两个数组中的常见项目列表 ouptput mang