从多维数组中提取特定元素

时间:2021-06-27 14:55:17

标签: ios arrays swift destructuring

我想使用另一个数组的索引数组来提取指定的元素。

这样的结果是一个一维数组或结果。

显然不太正确的伪代码:

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]

3 个答案:

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