0

配列にゼロを埋め込もうとしていますが、これを迅速に行うための簡潔な方法が見つかりません。配列がある場合 x = [1,2,3 ; 4,5,6 ; 7,8,9] matlab でコマンドを使用できます

y = [zeros(1,3+2);zeros(3,1),x,zeros(3,1);zeros(1,3+2)]

[0,0,0,0,0の望ましい出力配列を与える; 0,1,2,3,0; 0,4,5,6,0; 0,7,8,9,0; 0,0,0,0,0]

ただし、これまでのところ、迅速なプレイグラウンドでは、各要素を個別に参照して新しい配列を正しく形成することしかできませんでした。

x を入力として、y を出力としてこれまでに試した方法は、最初は matlab に似ていて、

var x = [[1,2,3,],[4,5,6],[7,8,9]]

var y = [[0,0,0,0,0],[0,x[0],0],[0,x[1],0],[0,x[2],0],[0,0,0,0,0]]

2つ目はループ

for i in 0 ..< x.count + 1 {
  if i == 0 || i == x.count - 1 {
    y[i] = [0,0,0,0,0]
  }
  else{
    y[i] = [0, x[i-1] ,0]
  }
}

Xcode プレイグラウンド プレビューの標準配列のように見えるのではなく、これが出力されます。

[[0, 0, 0, 0, 0], [0, […], 0], [0, 0, 0, 0, 0], [0, […], 0], [0, 0, 0, 0, 0]]

コードを使用して、コンソールにも非常に奇妙に出力されます

for i in 0 ..< y.count {
    print("\(y[i])")
}

出力は

(
    0,
    0,
    0,
    0,
    0
)
(
    0,
        (
        1,
        2,
        3
    ),
    0
)
(
    0,
    0,
    0,
    0,
    0
)
(
    0,
        (
        7,
        8,
        9
    ),
    0
)
(
    0,
    0,
    0,
    0,
    0
)

予想に反して

[0, 0, 0, 0, 0]
[0, 1, 2, 3, 0]
[0, 4, 5, 6, 0]
[0, 7, 8, 9, 0]
[0, 0, 0, 0, 0]

これを行う最善の方法は何ですか?

4

3 に答える 3

2

任意のネストされた配列型を取ることができるappzYourLife の回答の汎用バージョンを作成しました。また、上下のパディングのサポートも追加します

extension Array where Element: _ArrayType {
    typealias InnerElement = Element.Generator.Element

    func pad2DArray(with padding: InnerElement,
                    top: Int = 0, left: Int = 0,
                    right: Int = 0, bottom: Int = 0) -> [[InnerElement]] {
        let newHeight = self.count + top + bottom
        let newWidth = (self.first?.count ?? 0) + left + right

        var paddedArray = [[InnerElement]](count: newHeight, repeatedValue:
                        [InnerElement](count: newWidth, repeatedValue: padding))

        for (rowIndex, row) in self.enumerate() {
            for (columnIndex, element) in row.enumerate() {
                paddedArray[rowIndex + top][columnIndex + left] = element
            }
        }

        return paddedArray
    }
}

var input = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

let result = input.pad2DArray(with: 0, top: 1, left: 1, right: 1, bottom: 1)

/*
result:
[
    [0, 0, 0, 0, 0],
    [0, 1, 2, 3, 0],
    [0, 4, 5, 6, 0],
    [0, 7, 8, 9, 0],
    [0, 0, 0, 0, 0],
]
*/
于 2016-08-05T03:07:55.577 に答える
-1

拡大

この拡張子を定義すると

extension _ArrayType where Element == Int {
    func pad(left left: Int, right: Int) -> [Int] {
        let leftSide = [Int](count: left, repeatedValue: 0)
        let rightSide = [Int](count: right, repeatedValue: 0)
        return leftSide + (self as! [Int]) + rightSide
    }
}

その後、書くことができます

[1,2,3].pad(left: 1, right: 1) // [0, 1, 2, 3, 0]
于 2016-08-04T21:24:55.260 に答える
-1

受け入れられた答えほどエレガントではありませんが、それでも機能します:

var x = [[1,2,3,],[4,5,6],[7,8,9]]
var y = [[Int]]()

y.insert([0,0,0,0,0], atIndex: 0)

for i in 0 ..< x.count {
    var intArray: [Int] = []
    for number in x[i] {
        intArray.append(number)
    }
    intArray.insert(0, atIndex: 0)
    intArray.insert(0, atIndex: intArray.count)
    y.append(intArray)
}

y.insert([0,0,0,0,0], atIndex: x.count + 1)

からの出力

for i in 0 ..< y.count {
    print("\(y[i])")
}

[0, 0, 0, 0, 0]

[0, 1, 2, 3, 0]

[0, 4, 5, 6, 0]

[0, 7, 8, 9, 0]

[0, 0, 0, 0, 0]

于 2016-08-04T22:18:28.273 に答える