2017-11-03 16 views
-2

配列内の特定の項目のインデックスを取得するには?私が配列している場合

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

を例えば「りんご」の指標は何ですか?プログラム的に取得する方法はありますか?

+0

を読み、そのエレガントが、単純ではありません:あなたはこのようにそれを使用することができます

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 } } 

タプル(1,2)? – xtofl

+0

https://stackoverflow.com/q/24028860/6610 – xtofl

答えて

-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) 
} 
+0

indexOfはインデックスの名前が –

+0

に変更されました。BtwはBoolではありません。あなたは条件付きでifを使うことはできません。 –

+0

ループを壊した場合、それは決して印刷されません。 –

3

あなたはindex(of:)を使用してindex(where:)を使用して、それのサブインデックスを見つけることができます。

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


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

} 

を拡張として:

extension Array where Element: Collection, Element.Element: Equatable, Element.Index == Index { 
    func indexAndSubIndex(of element: Element.Element) -> (index: Index, subIndex: Index)? { 
     if let index = index(where: {$0.contains(element)}), 
      let subIndex = self[index].index(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" 
} 
0

別のオプションとして、拡張。 tupleIndex(of:)関数は、(Int, Int)?のタプルを返します。

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

Swift 4では、Element == Iterator.Elementなので、制約を単純化することができます。 –

+0

条件付きキャストの代わりに制約Element.Index == Intを追加する方が良いです。 Int。 - あなたのアプローチ '[" abc "、" def "]。tupleIndex(of:" b ")'はコンパイルされますが、nilを返します。 –

+0

あなたは正しいです。私はその事件を逃した。とにかく条件付きキャストに満足していなかったので、提案に感謝します。私は私の答えを編集します。 – Yannick

0

、あなたは意味返す関数 `getIndexFor( "オレンジ")を`

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")) 
関連する問題