Swift 通用数组函数查找不匹配项的元素的所有索引

2023-11-23

Swift 3

尝试编写一个通用数组扩展来获取不等于值的项目的所有索引

example

 let arr: [String] = ["Empty", "Empty", "Full", "Empty", "Full"]
 let result: [Int] = arr.indexes(ofItemsNotEqualTo item: "Empty")
 //returns [2, 4]

我尝试创建一个通用函数:

extension Array {

    func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]?  {
        var result: [Int] = []
        for (n, elem) in self.enumerated() {
            if elem  != item {
                result.append(n)
            }
        }
        return result.isEmpty ? nil : result
    }
}

但这给出了一个警告:二元运算符不能应用于“Element”和“T”类型的操作数。

然后我在投射元素的地方做了这个(注意as?)

extension Array {

    func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]?  {
        var result: [Int] = []
        for (n, elem) in self.enumerated() {
            if elem as? T != item {
                result.append(n)
            }
        }
        return result.isEmpty ? nil : result
    }
}

但现在看来类型检查已经消失了,因为如果我传入一个整数,我会得到错误的结果

 let arr: [String] = ["Empty", "Empty", "Full", "Empty", "Full"]
 let result: [Int] = arr.indexes(ofItemsNotEqualTo item: 100)
 //returns [0, 1, 2, 3, 4]

帮助将不胜感激。

有没有更好的方法来做到这一点reduce功能?


您已经定义了一个通用方法

func indexes<T: Equatable>(ofItemsNotEqualTo item: T) -> [Int]?

它接受一个类型的参数T这需要是Equatable,但与Element数组的类型。

所以

let arr = ["Empty", "Empty", "Full", "Empty", "Full"]
let result = arr.indexes(ofItemsNotEqualTo: 100)

编译,但是elem as? T gives nil(这是!= item) 对于所有数组元素。

你想要的是一个只为数组定义的方法Equatable元素。这可以通过约束来实现 扩大:

extension Array where Element: Equatable {
    func indexes(ofItemsNotEqualTo item: Element) -> [Int]?  {
        var result: [Int] = []
        for (n, elem) in enumerated() {
            if elem != item {
                result.append(n)
            }
        }
        return result.isEmpty ? nil : result
    }
}

实际上我不会让返回值成为可选的。 如果所有元素都等于给定项,则逻辑 返回值将是空数组。

有没有更好的方法来使用reduce函数来做到这一点?

好吧,你could use reduce(),但这不是很有效,因为在每个迭代步骤中都会创建中间数组:

extension Array where Element: Equatable {
    func indexes(ofItemsNotEqualTo item: Element) -> [Int]  {
        return enumerated().reduce([]) {
            $1.element == item ? $0 : $0 + [$1.offset]
        }
    }
}

你实际上拥有的是一个 “过滤+映射”操作:

extension Array where Element: Equatable {
    func indexes(ofItemsNotEqualTo item: Element) -> [Int]  {
        return enumerated().filter { $0.element != item }.map { $0.offset }
    }
}

可以使用简化flatMap():

extension Array where Element: Equatable {

    func indexes(ofItemsNotEqualTo item: Element) -> [Int]  {
        return enumerated().flatMap { $0.element != item ? $0.offset : nil }
    }
}

例子:

let arr = ["Empty", "Empty", "Full", "Empty", "Full"]
arr.indexes(ofItemsNotEqualTo: "Full") // [0, 1, 3]

[1, 1, 1].indexes(ofItemsNotEqualTo: 1) // []

arr.indexes(ofItemsNotEqualTo: 100)
// error: cannot convert value of type 'Int' to expected argument type 'String'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 通用数组函数查找不匹配项的元素的所有索引 的相关文章

  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 标准转换:数组到指针的转换

    这是ISO的观点 标准转换 数组到指针的转换 4 2 1 数组 类型的左值或右值 N T 或 未知边界的数组 T 可以转换为右值 类型为 指向 T 的指针 结果是 指向第一个元素的指针 数组 如果可能的话 任何人都可以用一个示例程序来解释这
  • 如何使用 NSUserDefaults 在 Swift 中存储自定义类的数组?

    我有一个名为的自定义类Person当某人输入信息时 它会存储有关某人的各种属性 class Person Person dictionary variable var name String var age String var html
  • 3D 数组到 3D std::vector

    我在代码函数中用 3D std vector 替换了 3D 数组 它进入了无限循环 你能给我一个提示吗 我真的需要使用向量而不是数组 谢谢 我最初的代码是 arr is a 3D array of a sudoku table the 3
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • TypeScript 中泛型的不安全隐式转换

    TypeScript 编译器tsc编译以下代码 即使使用 strict旗帜 然而 该代码包含一个基本错误 而在 Java 或 C 等语言中可以避免这种错误 interface IBox
  • 提供通用服务接口最具体实现的依赖注入机制

    我觉得我和标题一起玩了流行语宾果游戏 这是我所要求的一个简洁示例 假设我有一些实体的继承层次结构 class BaseEntity class ChildAEntity BaseEntity class GrandChildAEntity
  • 从未调用过交互式委托方法

    我想在 ViewController 1 和 NavigationViewController 2 之间进行交互式转换 NavigationController 通过按钮调用 因此呈现时没有交互转换 它可以通过按钮或 UIPanGestur
  • Swift:设置协议的可选属性

    如何设置协议的可选属性 例如 UITextInputTraits 有许多可选的读 写属性 当我尝试以下操作时 出现编译错误 无法分配给 textInputTraits 中的 keyboardType func initializeTextI
  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • 无法以编程方式快速设置 NSLayoutConstraint 乘数...“无法分配给此表达式的结果

    我试图以编程方式快速设置乘法器的约束 当我设置该值时 它只会给我错误 无法分配给该表达式的结果 我用 IBOutlet 声明了 NSLayoutConstraint 然后设置乘数 就像我对另一个常量所做的那样 效果很好 但这个不会接受它 I
  • 如何使用 IOS 12 在 UITableViewCell 中正确添加 UICollectionView

    由于某些原因 在使用 Xcode 10 beta 时 我无法正确显示 tableview 单元格内集合中的某些项目 在过去的四天里我尝试了我所知道的一切 我做了一个小项目样本来看看我的问题是什么 如果有人想在本地运行完整代码 请参见此处 h
  • 在 Objective-C 中的 Swift 类上调用 NSStringFromClass 返回模块损坏的名称

    我知道这个问题 https stackoverflow com questions 24107658 get a user readable version of the class name in swift in objc nsstri
  • 在 SwiftUI 中使用可观察对象切换视图

    我正在练习尝试使用 SwiftUI 中的可观察对象切换视图 但我的代码无法正常工作 我知道我可以用 State 来做到这一点 但我想用可观察的对象来实现这一点 当我单击内容视图中的图像时 图像不会改变 有人能帮我吗 内容视图 swift i
  • Hadoop 减速器数量配置选项优先级

    以下3个设置reduce数量的选项的优先级是什么 换句话说 如果三者都设置了 会考虑哪一个呢 Option1 setNumReduceTasks 2 within the application code Option2 D mapredu
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 在 Object 子类及其自己的子类上实现ignoreProperties()

    我是领域新手 我正在使用继承自 Object 的基类以及该基类的自定义子类创建模型 我的模型要求基类通过覆盖静态来声明一些属性被忽略ignoredProperties 方法 当尝试在某些基类子类上重写该方法时 我收到一个 Swift 编译器
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 如何计算 3D 坐标的线性索引,反之亦然?

    如果我有一个点 x y z 如何找到该点的线性索引 i 我的编号方案是 0 0 0 是 0 1 0 0 是 1 0 1 0 是最大 x 维度 另外 如果我有一个线性坐标 i 我如何找到 x y z 我似乎无法在谷歌上找到这个 所有结果都充满

随机推荐

  • VS Code 根据文件中的单词自动完成

    我刚刚开始使用 VS Code 目前我对此非常满意 我来自 Notepad 对于我正在做的事情 我没有找到任何处于同一 级别 的 IDE 直到现在 我真的很喜欢 VS Code 所做的事情以及所有现代集成技术如何帮助我 但我怀念 NPP 所
  • 如何增加 Symfony 2 表单上文件的上传限制?

    我在 Symfony 中有一个表单 用户可以将文件上传到其中 这些文件的大小最大可达 50Mb 但是 当我尝试上传大约 10Mb 的文件 在此之前 文件不大于 7 2Mb 时 表单会重新加载并出现以下错误 上传的文件太大 请尝试上传较小的文
  • ImageButton 不显示特定的可绘制对象

    这是我遇到过的一个相当有趣的问题 我的表格布局有 9 个图像按钮 每行 3 个 每个 ImageButton 都有一个与之关联的不同图像 我已将图像按钮的背景设置为透明 00000000 现在有趣的事情发生了 其中一张图像没有显示在模拟器
  • 如何处理 Win32 错误消息的占位符?

    我想在我的程序遇到 Win32 错误时显示有意义的错误消息 我打电话GetLastError 进而FormatMessage 但某些错误消息包含占位符 例如 ERROR BAD EXE FORMAT有文字 1 不是有效的 Win32 应用程
  • 如何在Python中使用cv2和多重处理并行从视频中获取帧

    我一直在 python 中使用 cv2 和多处理 我终于有了一个工作脚本 一旦各个帧已经在输入队列中 它就会对它们进行处理 但是 我想首先通过使用多个核心来加快将帧放入队列的速度 因此我尝试使用相同的多处理方法将每个图像读入队列 但我似乎无
  • python 3.5 上的 PyHook

    我正在尝试在 python 上编写一个基本的键盘记录程序 我需要安装 pywin32 和 pyhook 模块 我已经成功安装了 pywin32 但似乎无法 pyhook 工作 我已经读到它可以在更高版本的 python 上工作 但似乎无法弄
  • Spring 3 MVC:动态表单中的一对多(在创建/更新时添加/删除)

    我正在寻找解决方案管理 HTML 表单中的一对多关系 using jQuery 我正在开发Spring 春季MVC and 休眠 我在网上找到了很多曲目 但没有任何有效的完整示例 的背景 我有三个 JPA 实体 Consult java 1
  • Erlang:分布式应用程序奇怪的行为

    我使用分布式 erlang 应用程序进行支付 配置和思路取自 http www erlang org doc pdf otp system documentation pdf9 9 分布式应用程序 我们有3个节点 n1 a2 X201 n2
  • 如何在 Android 中将 webview 捕获为位图?

    我有一个网络视图 我需要向下滚动才能查看所有内容 现在 我想要捕获整个网络视图到位图 我找了很多次 人们建议我使用该功能capturePicture 然而 这个函数是已弃用 那么 我还可以使用哪些其他方法来实现我的目标 谢谢大家 Andro
  • Xamarin WebView 缩放以适应

    有没有办法在 Xamarin 中设置 WebView 以默认缩放其内容以适合屏幕 并且仍然允许捏放大 缩小 我们将用它来显示我们在线的文档 我解决了自定义渲染器的页面缩放和缩放问题 如下所示 For IOS public class Cus
  • RcppArmadillo的sample()在更新R后不明确

    我通常使用一个简短的 Rcpp 函数 该函数将一个矩阵作为输入 其中每行包含 K 个概率 总和为 1 然后 该函数为每行随机采样一个 1 到 K 之间的整数 对应于提供的概率 这是函数 Rcpp depends RcppArmadillo
  • 如何在安装了 python 2 和 3 的情况下使用 pip? (操作系统)

    我正在尝试让 python 3 在我的 OSX 笔记本电脑上运行 我需要安装 python 3 的请求 但它不起作用 我想我已经成功地为 python 2 7 和 python3 安装了 pip 但是 每当我使用 pip 时 它都会指向 p
  • 替换文件内容中的字符串[重复]

    这个问题在这里已经有答案了 如何打开文件 Stud txt 然后将所有出现的 A 替换为 Orange with open Stud txt rt as fin with open out txt wt as fout for line i
  • 异步 Javascript 变量覆盖

    该代码存在一个问题 即调用异步函数时变量会被覆盖 如何解决 Code for x in files asynchronousFunction var1 var2 function console log x someVaraible 现在的
  • 如何使用 Contacts with Swift 对联系人进行排序

    我已经阅读了有关对联系人进行排序的苹果官方文档 尽管我不确定如何实现它 所以 这是获取请求 let fetchRequest CNContactFetchRequest keysToFetch keysToFetch 和我喜欢的排序顺序 l
  • 如何在 MacOS 上安装 Boost?

    如何在 MacOS 上安装 Boost 现在我找不到 Mac 版的 bjam 您可以使用以下方式获取最新版本的 BoostHomebrew brew install boost
  • 实体框架代码优先 - 来自同一个表的两个外键

    我刚刚开始使用 EF 代码 所以我是这个主题的初学者 我想在团队和比赛之间创建关系 1 场比赛 2 支球队 主队 客队 和结果 我认为创建这样的模型很容易 所以我开始编码 public class Team Key public int T
  • 无法将企业应用程序安装到未注册 UUID 的设备

    我创建了一个通用应用程序 我正在尝试使用我们的企业开发人员许可证分发该应用程序 问题是这样的 如果我在注册了 UUID 的设备上安装该应用程序 则该应用程序安装正常 如果我 尝试 在未注册 UUID 的设备上安装应用程序 则安装将无法完成
  • 过去 7 天的 Sqlite SELECT *

    我正在尝试执行 SELECT 来检索 SQLite 中过去 7 天的行 表结构如下 CREATE TABLE session rowID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL steps IN
  • Swift 通用数组函数查找不匹配项的元素的所有索引

    Swift 3 尝试编写一个通用数组扩展来获取不等于值的项目的所有索引 example let arr String Empty Empty Full Empty Full let result Int arr indexes ofItem