如何获得2D数组中项目的索引?

问题描述 投票:-2回答:4

如果我有一个数组:

let array = [
        ["Hamburger", "Nachos", "Lasagne"],
        ["Tomatoes", "Apples", "Oranges"],
        ["Soda", "Juice", "Water"]
    ]    

例如“ Apples”的索引是什么?有没有办法以编程方式获取它?

arrays swift
4个回答
4
投票

您可以使用firstIndex(where:)并使用firstIndex(of:)查找其子索引:

let array = [
    ["Hamburger", "Nachos", "Lasagne"],
    ["Tomatoes", "Apples", "Oranges"],
    ["Soda", "Juice", "Water"]
]

let query = "Apples"
if let index = array.firstIndex(where: {$0.contains(query)}),
    let subIndex = array[index].firstIndex(of: query) {
    print(array[index][subIndex])  // Apples

}

作为扩展名:

extension Collection where Element: Collection, Element.Element: Equatable {
    func indexAndSubIndex(of element: Element.Element) -> (index: Index, subIndex: Element.Index)? {
        if let index = firstIndex(where: {$0.contains(element)}),
            let subIndex = self[index].firstIndex(of: element) {
            return (index,subIndex)
        }
        return nil
    }
}

用法:

let array = [
    ["Hamburger", "Nachos", "Lasagne"],
    ["Tomatoes", "Apples", "Oranges"],
    ["Soda", "Juice", "Water"]
]
let query = "Soda"
if let indexes = array.indexAndSubIndex(of: query) {
    print(indexes)   // "(index: 2, subIndex: 0)\n"
}

这也可以从字符串数组中找到字符的索引:

let array = ["Hamburger", "Nachos", "Lasagne"]
let query: Character = "h"
if let indices = array.indexAndSubIndex(of: query) {
    print(indices)   // "(index: 1, subIndex: Swift.String.Index(_rawBits: 196865))\n"
    array[indices.index][indices.subIndex]  // "h"
}

0
投票

另一个扩展选项。函数tupleIndex(of:)返回(Int, Int)?的元组。

let array = [
    ["Hamburger", "Nachos", "Lasagne"],
    ["Tomatoes", "Apples", "Oranges"],
    ["Soda", "Juice", "Water"]
]

extension Collection where
    Element: Collection,
    Element.Element: Equatable,
    Element.Index == Int {

    func tupleIndex(of elementToFind: Element.Element) -> (Int, Int)? {
        for (firstIndex, element) in self.enumerated() {
            if let secondIndex = element.index(of: elementToFind) {
                return (firstIndex, secondIndex)
            }
        }
        return nil
    }
}

您可以这样使用它:

print(array.tupleIndex(of: "Apples")) //prints Optional((1, 1))

0
投票

它不优雅,但易于阅读

func getIndices(arr: [[String]], word: String) -> (Int, Int)? {
  for i in 0..<arr.count {
    let subArr = arr[i]
    if let index = subArr.index(of: word) {
        return (i, index)
    }
  }
  return nil
}
let result = getIndices(arr: array, word: "Apples"))

-3
投票
let array = [
        ["Hamburger", "Nachos", "Lasagne"],
        ["Tomatoes", "Apples", "Oranges"],
        ["Soda", "Juice", "Water"]
]

for arr in array {

  let answer = arr.indexOf("Apples")
  if answer {
    break
  }
print(answer)
}
© www.soinside.com 2019 - 2024. All rights reserved.