根据另一个数组的顺序对数组进行有效排序

2024-01-09

假设我有这个:

struct Pet {
    let name: String
}

let pets = [Pet(name: "Z"), Pet(name: "F"), Pet(name: "A"), Pet(name: "E")]
let petNames = ["E", "F", "Z", "A"]

我的预期输出是:

[Pet(name: "E"), Pet(name: "F"), Pet(name: "Z"), Pet(name: "A")]

我该如何排序pets通过以下方式有效地petNames' order?

我当前的方法似乎效率极低:

var sortedPets = [Pet]()
for n in petNames {
    sortedPets.append(pets.first(where: { return $0.name == n })!)
}

我可以使用任何功能性方法吗?


效率不高,但它从功能上解决了问题:

let pets2 = pets.sorted{petNames.index(of:$0.name)! < petNames.index(of:$1.name)!}

现在我们知道我们在追求什么,这更复杂,但效率更高,因为字典查找速度很快:

var d = [String:Int]()
zip(petNames, 0..<petNames.count).forEach { d[$0.0] = $0.1 }
let pets2 = pets.sorted{d[$0.name]! < d[$1.name]!}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据另一个数组的顺序对数组进行有效排序 的相关文章

随机推荐

  • GoogleMaps v3 API 单击时仅创建 1 个标记

    我成功地创建了一个点击标记 但是 使用以下代码 每次点击我都会得到一个新标记 我只希望添加一个标记 如果有人点击多次 我希望它将现有标记移动到新标记任何人都可以帮忙这是代码 function placeMarker location var
  • 解压缩 zip 文件会出现“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException 无法读取本地标头版本 45”

    我只想提取一个普通的 zip 文件 但它总是失败 这是我现在使用的代码 private File downloadPath new File Environment getExternalStorageDirectory Test file
  • Facebook 提示用户登录两次

    我有一个 Android 应用程序 可通过 Facebook 登录并与 parse com 集成 不幸的是 当用户使用 Facebook 登录时 授权 Web 视图会启动两次 我已经广泛搜索了合适的解决方案 但还没有找到 我也玩过 Face
  • 使用 JavaScript 发送邮件

    我想在用户单击图像时打开一个带有 收件人地址 的新 Outlook 邮件模板 我已经在 html 页面中返回了我的代码 与图像链接 每当它加载时 javascript 都应该打开一个新的邮件模板 但该功能不起作用 请让我知道我的代码有什么问
  • 如何让 SignalR 在断开连接时表现得优雅

    我的应用程序经常会在糟糕的公司网络 代理 防火墙等 下使用 所以我不能依赖套接字 长轮询实际上是我唯一的选择 这是长轮询的最大问题 长轮询在某个时间点断开连接 我自动重新连接 根据文档 用户单击导致集线器方法调用的内容 但尚未建立连接 发生
  • 使用 MediaRecorder 录制音频 webm 时没有元数据

    对于我的项目 我使用 MediaRecorder 录制用户音频 它几乎工作正常 当我希望使用 Wavesurfer js 显示用户录音的波形时 我的问题就出现了 但它不会加载我的录音 不过 使用音频元素播放录音效果很好 在尝试不同的源之后
  • Docker-Compose 持久数据问题

    我在配置持久数据时遇到问题Mariadb 我在用着docker compose 每个服务都在一个容器中 Nginx PHP FPM and Mariadb 一切正常 除了Mariadb不存储数据 每次重新启动容器时 我都会丢失所有数据 然后
  • 如果我忘记将 null 分配给文件指针,如何检查文件是否打开

    我已经打开了一个文件 FILE fp fopen file txt r fclose fp 场景是我忘记分配 null 给fp现在我想使用相同的方法检查该文件是否打开fp pointer 你不能 的价值fp关闭后它是不确定的 http ww
  • 一个功能应用程序中具有多种耐用功能

    是否可以在一个函数应用程序中托管多个持久函数 我们如何为每个持久函数指定不同的任务中心名称 添加丹尼尔 戴森的回应 如果多个功能应用程序共享一个存储帐户 则每个功能应用程序必须配置单独的任务中心名称 一个存储帐户可以包含多个任务中心 此限制
  • Android ViewPager 中不同宽度的布局

    我想使用水平视图寻呼机创建一些滚动视图 左视图必须具有全屏宽度 但右视图只有四分之一宽度 它将是像 Dolphin 浏览器一样的垂直面板 可以这样做吗 我变了android layout width布局正确 但没有用 My code pub
  • 是否永远不可能使用 Silverlight OpenFileDialog 从文件中获取 FullName?

    我想从 Silverlight OpenFileDialog 上的文件获取全名 当我尝试这样做时 Silverlight 向我抛出错误 我看到 FullName 上有一个属性说它是 SECURITY CRITICAL 但我需要显示完整路径
  • 谷歌应用程序引擎开发服务器上的自动任务执行(python)

    python 开发服务器的文档是这样描述运行任务的 当您的应用程序运行在 开发服务器 任务队列是 不自动处理 反而 任务队列会累积您可以执行的任务 由开发商检查并执行 安慰 但是 python sdk 1 3 4 版本 我正在使用 的发行说
  • 枚举 Windows 纸张尺寸

    我可以使用获取当前区域设置纸张大小 GetLocaleStr LCID LOCALE IPAPERSIZE IntToStr DMPAPER A4 where LOCALE IPAPERSIZE 100A 但有没有办法枚举所有纸张尺寸及其名
  • 连接 SQL 查询中一个字段的多个结果

    我不确定这是否可以通过 SQL 查询实现 但我会尝试一下 我正在用 C 开发一个 SharePoint Web 部件 它连接到 SQL 数据库并运行查询 然后将该结果集数据绑定到网格视图 它工作正常 但我有一个小障碍 在大多数情况下 我的查
  • http 标头中是否允许存在多个线性空白

    我试图理解http www w3 org Protocols rfc2616 rfc2616 sec2 html sec2 2 http www w3 org Protocols rfc2616 rfc2616 sec2 html sec2
  • 使用 boost:asio 和 select?阻塞 TCP 输入或文件更新

    我原本打算在程序中设置一个线程 该线程将等待两个文件描述符 一个用于套接字 第二个用于描述文件系统的 FD 特别是等待查看是否将新文件添加到目录中 由于我预计很少会看到添加的新文件或传入的新 TCP 消息 因此我希望有一个线程等待任一输入并
  • 如何使用 Gradle 构建 Google protocol buffers 和 Kotlin?

    我正在尝试使用 Gradle 构建一个同时使用 Google 协议缓冲区和 Kotlin 的项目 我希望将 proto 文件编译为 Java 源代码 然后从我的 Kotlin 代码中调用该源代码 我的源文件是这样排列的 src main p
  • 使用 SearchView 过滤 RecyclerView 的 LiveData 内容列表

    我创建了 RecyclerView 其中包含简单的单词列表 GroupVc 对象的字符串名称 由于列表可能很长 我想使用工具栏中的 SearchView 对其进行过滤 我的应用程序的架构基于 Android 架构组件 其中所有 GroupV
  • 如何将一个输入框中的值传递到另一个输入框

    我正在尝试在框之间传递值 因此 当用户在第一个文本框中键入时
  • 根据另一个数组的顺序对数组进行有效排序

    假设我有这个 struct Pet let name String let pets Pet name Z Pet name F Pet name A Pet name E let petNames E F Z A 我的预期输出是 Pet