查找数组中所有元素实例的索引

时间:2018-04-15 18:25:05

标签: arrays swift

这个问题老实说非常简单。有没有办法在swift中找到数组中所有元素的出现而不通过它循环?似乎所有内置方法只返回第一次出现的索引,而不是所有索引。

使用index(where:)样式方法返回索引数组会很有趣。有什么想法吗?

提前感谢任何输入!

修改

感谢大家的回复!看起来我应该更清楚这一点。我目前这样做的方式是一个看起来非常类似于下面发布的一个matt的扩展。我知道任何执行此操作的方法都必须遍历引擎盖下的数组,我更想知道是否有一个内置的方法埋藏在我不知道的语言中。这似乎是某些人通常想做的事情。看起来扩展就在这里!

3 个答案:

答案 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))]