这个问题老实说非常简单。有没有办法在swift中找到数组中所有元素的出现而不通过它循环?似乎所有内置方法只返回第一次出现的索引,而不是所有索引。
使用index(where:)
样式方法返回索引数组会很有趣。有什么想法吗?
提前感谢任何输入!
修改
感谢大家的回复!看起来我应该更清楚这一点。我目前这样做的方式是一个看起来非常类似于下面发布的一个matt的扩展。我知道任何执行此操作的方法都必须遍历引擎盖下的数组,我更想知道是否有一个内置的方法埋藏在我不知道的语言中。这似乎是某些人通常想做的事情。看起来扩展就在这里!
答案 0 :(得分:4)
有没有办法在swift中找到数组中所有元素的出现而不循环遍历它
不,显然不是。没有神奇的力量可以同时瞥一眼整个阵列。
你不必进行循环,但无论你做什么,你至少都要让Swift遍历数组来你。 某人 - 无论是你还是Swift - 必须循环。
例如,这可能看起来优雅而简洁:
let arr = [1, 2, 3, 1, 0, 1, 2, 2, 3, 1, 1, 2]
let target = 1
let indices = arr.enumerated().reduce(into: []) {
if $1.1 == target {$0.append($1.0)}
}
// indices is [0, 3, 5, 9, 10]
...但是猜猜reduce
的作用是什么?它循环。
顺便说一句,我建议将这类事物封装成一个通用的扩展名:
extension Collection where Element : Equatable {
func allIndices(of target:Element) -> [Int] {
let indices = self.enumerated().reduce(into: [Int]()) {
if $1.1 == target {$0.append($1.0)}
}
return indices
}
}
这样,只要你想要所有的指数,你就可以这样说:
let arr = [1, 2, 3, 1, 0, 1, 2, 2, 3, 1, 1, 2]
let indices = arr.allIndices(of: 1)
答案 1 :(得分:3)
我建议采用以下方式:
let arr = [1, 2, 3, 1, 0, 1, 2, 2, 3, 1, 1, 2]
let search = 1
let indices = arr.enumerated().flatMap { $1 == search ? $0 : nil }
print(indices)
[0,3,5,9,10]
答案 2 :(得分:2)
您可以创建自己的索引方法,该方法将闭包作为参数,以便按预期运行:
extension Collection where Element: Equatable {
func indices(of element: Element) -> [Index] {
return indices.filter { self[$0] == element }
}
func indices(where isIncluded: (Element) -> Bool) -> [Index] {
return indices.filter { isIncluded(self[$0]) }
}
}
let arr = [1, 2, 3, 1, 0, 1, 2, 2, 3, 1, 1, 2]
let search = 1
let indices = arr.indices(where: { $0 == search })
// or simply
// let indices = arr.indices { $0 == search }
print(indices) // [0, 3, 5, 9, 10]
let indices2 = arr.indices(of: search)
print(indices2) // [0, 3, 5, 9, 10]
let string = "Hello World !!!"
let indices3 = string.indices(of: "o")
print(indices3) // [Swift.String.Index(_compoundOffset: 16, _cache: Swift.String.Index._Cache.character(1)), Swift.String.Index(_compoundOffset: 28, _cache: Swift.String.Index._Cache.character(1))]