我想使用另一个数组的索引数组来提取指定的元素。
这样的结果是一个一维数组或结果。
显然不太正确的伪代码:
let p:[[Double]] = [[3,2],[4,1]]
let t:[[Int]] = [[0,0],[1,0]]
t.map{ (y,x) in p[y][x] } // expecting: [3,4]
答案 0 :(得分:2)
将元组用于索引会使您的代码更安全,因为元组可以声明为具有固定数量的元素。
以下是可能的实现方式:
func extract<T>(indices: [(Int, Int)], from array: [[T]]) -> [T] {
indices.map { array[$0][$1] }
}
let p: [[Double]] = [[3,2], [4,1]]
let t = [(0,0), (1,0)]
print(extract(indices: t, from: p)) // [3.0, 4.0]
可以添加重载以支持 3-D 数组或 4-D 数组。例如,对于 3-D 数组:
func extract<T>(indices: [(Int, Int, Int)], from array: [[[T]]]) -> [T] {
indices.map { array[$0][$1][$2] }
}
答案 1 :(得分:2)
这是一个可以从数组中提取动态数量元素的函数。为了简化参数,索引作为单个值给出,因此它们应该以正确的顺序给出。我还使用 precondition
来检查给定的索引是不是太多或太大
func extract<Value>(from array: [[Value]], _ indices: Int...) -> [Value] {
precondition(indices.count <= array.count)
return indices.enumerated().map {
let row = array[$0.offset]
precondition(row.count > $0.element)
return row[$0.element]
}
}
此处测试的替代方法是使用可选索引 Int?...
在使用可选索引或避免前置条件逻辑时不从所有列中提取和/或返回 [Value?]
。
答案 2 :(得分:1)
你可以试试
let p:[[Double]] = [[3,2],[4,1]]
let t:[[Int]] = [[0,0],[1,0]]
let res = t.map { p[$0.first!][$0.last!] }
print(res)