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工作的谢谢大家。你所有答案中的“快速性”太高了,非常感谢大家。你所有答案中的“快速性”太高了