【发布时间】:2021-10-27 21:57:17
【问题描述】:
我有一个数组,比如
var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]
我想在arr 中找到dd 的第一个索引。我正在尝试这段代码,但没有得到结果
let val = arr.first(where: {$0.1 == "dd" })
【问题讨论】:
我有一个数组,比如
var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]
我想在arr 中找到dd 的第一个索引。我正在尝试这段代码,但没有得到结果
let val = arr.first(where: {$0.1 == "dd" })
【问题讨论】:
从您的代码中,每个字母都有一个值,例如“aa”为 1,“b”为 2,依此类推。
如果你想找到“dd”对应的值,我建议你使用Hashmaps/Dictionary!!
所以你的代码将是
var values = ["aa":1, "b":2, "c":3, "dd":4, "e":5, "f":6]
let val = values["dd"] //val = 4
【讨论】:
首先,元组从 0 开始索引,因此它应该是 $0.0 并且要找到您需要使用 firstIndex 的索引,最后,由于您有一个数组数组,您需要向下钻取一个级别,然后在您返回时返回在内部数组中有匹配项,我使用 contains 作为内部数组
let val = arr.firstIndex(where: {
$0.contains(where: { tuple in tuple.0 == "dd" })
})
【讨论】:
val 在这种情况下将是第二个内部数组。第一个包含“dd”的内部数组
let val = arr.first(where: { $0.first(where: { $0.0 == "dd" }) != nil } )
【讨论】:
您使用了multi-dimensional arrays,请说明您要查找哪个索引(内部/外部索引)。
如果您指的是外部数组索引:
let outerIndex = arr.firstIndex(where: { $0.contains(where: { $0.0 == "dd"}) })
如果你的意思是内部数组索引:
let innerIndex = arr.map({ $0.firstIndex(where: { $0.0 == "dd" }) }).filter({ $0 != nil }).first
如果您需要两个索引:
var bothIndex: (outer: Int?, inner: Int?) {
guard let outerIndex: Int = arr.firstIndex(where: { $0.contains(where: { $0.0 == "dd"}) }) else {
assertionFailure()
return (nil,nil)
}
let innerIndex: Int? = arr[outerIndex].firstIndex(where: { $0.0 == "dd"})
return (outerIndex, innerIndex)
}
【讨论】:
你有一个数组数组。您需要外部数组和内部数组的索引:
var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]
let predicate: ((String,Int)) -> Bool = { $0.0 == "dd" }
if let index = arr.firstIndex(where: {$0.contains(where: predicate)}),
let subIndex = arr[index].firstIndex(where: predicate) {
print(arr[index][subIndex]) // ("dd", 4)
}
扩展该主题:
extension Collection where Element: Collection {
func firstIndexAndSubIndex(where predicate: (Element.Element) -> Bool) -> (index: Index, subIndex: Element.Index)? {
if let index = firstIndex(where: {$0.contains(where: predicate)}),
let subIndex = self[index].firstIndex(where: predicate) {
return (index,subIndex)
}
return nil
}
}
用法:
var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]
if let idxs = arr.firstIndexAndSubIndex(where: { $0.0 == "dd" } ) {
print(arr[idxs.index][idxs.subIndex]) // ("dd", 4)
}
【讨论】: