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

时间:2017-07-31 09:55:12

标签: multidimensional-array swift3 padding transpose

我的数组类型为[[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填充到没有相等行或列映射的数组。

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

4 个答案:

答案 0 :(得分:1)

你应该试试这个:

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

答案 1 :(得分:1)

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

v0.3.5

答案 2 :(得分:0)

这是实现您想要的功能的实现:

func transpose(_ input: [[Int]]) -> [[Int]] {
    let columns = input.count
    let rows = input.reduce(0) { max($0, $1.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
}

就个人而言,我建议不要使用诸如0之类的任意哨兵值,并且我将结果数组中的值设为可选,其中nil表示没有值。我可能会把它设为通用方法:

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

    var result: [[T?]] = []

    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(nil)
            }
        }
    }

    return result
}

答案 3 :(得分:0)

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

func transpose<T>(_ input: [[T]], defaultValue: T) -> [[T]] {
    let columns = input.count
    let rows = input.reduce(0) { max($0, $1.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)