如何在 Swift 3 中转置不等数组长度的矩阵

How to transpose a matrix of unequal array length in Swift 3

我的数组是[[Int]]类型

array = [[1,2,3],
         [4,5,6],
         [7,8,9,10],
         [11,12,13],
         [14,15,16]]

我希望转置结果为:

array = [[1,4,7,11,14],
         [2,5,8,12,15],
         [3,6,9,13,16],
         [0,0,10,0,0]]

如何将 0 填充到没有相等行或列映射的数组。

我希望转置适用于具有不相等映射元素的行和列。请帮忙。

你应该试试这个:

Swift 3

var array = [[1,2,3,4],[5,6,7,8],[9,10,11],[12,13,14]]
var arraytrans = [[Int]]()

override func viewWillAppear(_ animated: Bool)
{
    for i in stride(from: 0, to: array.count, by: 1)
    {
        var subArray = [Int]()
        for j in stride(from: 0, to: array.count, by: 1)
        {
            if array[i].count < array.count
            {
                array[i].append(0)
            }
            subArray.append(array[j][i])
        }
        arraytrans.append(subArray)
    }
    print(self.arraytrans) 
}

谢谢..! @Pragnesh Vitthani 我刚刚修改了你的答案。

var array = [[1,2,3],
             [4,5,6],
             [7,8,9,10],
             [11,12,13],
             [14,15,16]]

var transposedArray = [[Int]]

for i in stride(from: 0, to: array.count, by: 1)
{
    var subArray = [Int]()
    for j in stride(from: 0, to: array.count, by: 1)
    {
        if array[j].count < array.count
        {
            array[j].append(0)
        }
        subArray.append(array[j][i])
    }
    transposedArray.append(subArray )
}
print(transposedArray)

这是一个可以满足您要求的实现:

func transpose(_ input: [[Int]]) -> [[Int]] {
    let columns = input.count
    let rows = input.reduce(0) { max([=10=], .count) }

    var result: [[Int]] = []

    for row in 0 ..< rows {
        result.append([])
        for col in 0 ..< columns {
            if row < input[col].count {
                result[row].append(input[col][row])
            } else {
                result[row].append(0)
            }
        }
    }

    return result
}

或者,或者:

func transpose(_ input: [[Int]]) -> [[Int]] {
    let columns = input.count
    let rows = input.reduce(0) { max([=11=], .count) }

    return (0 ..< rows).reduce(into: []) { result, row in
        result.append((0 ..< columns).reduce(into: []) { result, column in
            result.append(row < input[column].count ? input[column][row] : 0)
        })
    }
}

基于@Rob 解决方案的通用版本:

func transpose<T>(_ input: [[T]], defaultValue: T) -> [[T]] {
    let columns = input.count
    let rows = input.reduce(0) { max([=10=], .count) }

    return (0 ..< rows).reduce(into: []) { result, row in
        result.append((0 ..< columns).reduce(into: []) { result, column in
            result.append(row < input[column].count ? input[column][row] : defaultValue)
        })
    }
}

用法:调用transpose(srings, defaultValue: "")transpose(integers, defaultValue: 0)