Arrays 过滤Swift数组并给出索引(非值)

Arrays 过滤Swift数组并给出索引(非值),arrays,swift,functional-programming,Arrays,Swift,Functional Programming,我需要根据数组元素的某些条件对数组进行过滤,但我需要获得通过测试的元素的索引,而不是元素本身 例如:给定一个Bool数组,我想将其转换为Int数组,该数组只包含原始数组中true元素的索引 我可以这样做: // INPUT array: let flags = [true, false, true, false] // OUTPUT array: var trueIndices = [Int]() for (index, value) in flags.enumerated() where

我需要根据数组元素的某些条件对数组进行过滤,但我需要获得通过测试的元素的索引,而不是元素本身

例如:给定一个
Bool
数组,我想将其转换为
Int
数组,该数组只包含原始数组中
true
元素的索引

我可以这样做:

// INPUT array:
let flags = [true, false, true, false]

// OUTPUT array:
var trueIndices = [Int]()

for (index, value) in flags.enumerated() where value == true {
    trueIndices.append(index)
}
…但它一点也不“迅捷”

还有更优雅的方式吗?类似于
filter()
,但返回的是索引而不是元素。

不确定“swifter”
是多少,但您也可以使用连续的
过滤器和
映射操作,或者只使用单个
平面映射。当然,您可以声明数组是不可变的,并且不必编写任何显式循环,这两种方法通常被认为比当前方法更实用

let trueIndices = flags.enumerated().filter{$0.element}.map{$0.offset}
print(trueIndices)
输出:

[0,2]

使用单个
flatMap

let trueIndices = flags.enumerated().flatMap { (offset, flag) in flag ? offset : nil }
不确定“swiftier”的值是多少,但您也可以使用连续的
过滤器
map
操作,或者只使用单个
flatMap
。当然,您可以声明数组是不可变的,并且不必编写任何显式循环,这两种方法通常被认为比当前方法更实用

let trueIndices = flags.enumerated().filter{$0.element}.map{$0.offset}
print(trueIndices)
输出:

[0,2]

使用单个
flatMap

let trueIndices = flags.enumerated().flatMap { (offset, flag) in flag ? offset : nil }

您可以直接
过滤
索引

let flags = [true, false, true, false]    
let trueIndices = flags.indices.filter{ flags[$0] }


您可以直接
过滤
索引

let flags = [true, false, true, false]    
let trueIndices = flags.indices.filter{ flags[$0] }


这是我要做的。它可以推广到序列,甚至是订阅不是O(1)的集合


这是我要做的。它可以推广到序列,甚至是订阅不是O(1)的集合


当然
enumerated()
提供了一个元组数组,我可以过滤/映射它。我想我已经编写了太多个小时了…flatMap版本没有在Xcode 9中编译。我的建议:
flags.enumerated().flatMap{(offset,flag)in flag?offset:nil}
@MartinR谢谢你的提示,我只在Xcode 8中进行了测试,但更新了我的答案,因为你的解决方案更清晰了你可能是说“声明数组不可变”是的,我在编辑我的措辞,忘了将可变改为不可变,谢谢,当然
enumerated()
提供了一个元组数组,我可以过滤/映射它。我想我已经编写了太多个小时了…flatMap版本没有在Xcode 9中编译。我的建议:
flags.enumerated().flatMap{(offset,flag)in flag?offset:nil}
@MartinR谢谢你的提示,我只在Xcode 8中进行了测试,但更新了我的答案,因为你的解决方案更清楚了,你可能是说“声明数组不可变”是的,我在编辑我的措辞,忘了将可变改为不可变,谢谢。哦,现在有道理了。您正在使用捕获外部
标志的闭包过滤所有索引的数组(?),并在当前索引(
$0
)处测试其内容。这是“更快速的”,要“在门户中思考”还有很长的路要走!当然可以为集合定义一个
func索引(其中包括:(Element)->Bool)->[Index]
扩展方法……只是提醒一下:这只在订阅是可能的情况下有效,并且在
O(1)
中也是可能的。对sequencesOh不起作用,现在有意义了。您正在使用捕获外部
标志的闭包过滤所有索引的数组(?),并在当前索引(
$0
)处测试其内容。这是“更快速的”,要“在门户中思考”还有很长的路要走!当然可以为集合定义一个
func索引(其中包括:(Element)->Bool)->[Index]
扩展方法……只是提醒一下:这只在订阅是可能的情况下有效,并且在
O(1)
中也是可能的。不会为Sequences工作的谢谢大家。你所有答案中的“快速性”太高了,非常感谢大家。你所有答案中的“快速性”太高了