簡體   English   中英

Swift中的多維數組

[英]Multidimensional arrays in Swift

編輯:正如亞當華盛頓指出的那樣,從Beta 6開始,這段代碼按原樣運行,所以這個問題已經不再適用了。

我正在嘗試創建並迭代二維數組:

var array = Array(count:NumColumns, repeatedValue:Array(count:NumRows, repeatedValue:Double()))

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

for column in 0...2 {
    for row in 0...2 {
        println("column: \(column) row: \(row) value:\(array[column][row])")
    }
}

但是,這是我得到的輸出:

column: 0 row: 0 value:3.0
column: 0 row: 1 value:6.0
column: 0 row: 2 value:9.0
column: 1 row: 0 value:3.0
column: 1 row: 1 value:6.0
column: 1 row: 2 value:9.0
column: 2 row: 0 value:3.0
column: 2 row: 1 value:6.0
column: 2 row: 2 value:9.0

看起來該行中的最后一列正在覆蓋其他列值。

我宣布錯了嗎?

編輯:也許游樂場的照片會有所幫助:

從游樂場捕獲

正如其他答案所述,您要為每列添加相同的行數組。 要創建多維數組,必須使用循環

var NumColumns = 27
var NumRows = 52
var array = Array<Array<Double>>()
for column in 0..NumColumns {
    array.append(Array(count:NumRows, repeatedValue:Double()))
}
var array: Int[][] = [[1,2,3],[4,5,6],[7,8,9]]

for first in array {
    for second in first {
        println("value \(second)")
    }
}

要實現您正在尋找的內容,您需要將數組初始化為正確的模板,然后循環以添加行和列數組:

var NumColumns = 27
var NumRows = 52
var array = Array<Array<Int>>()
var value = 1

for column in 0..NumColumns {
    var columnArray = Array<Int>()
    for row in 0..NumRows {
        columnArray.append(value++)
    }
    array.append(columnArray)
}

println("array \(array)")

對於未來的讀者,這是一個優雅的解決方案(5x5):

var matrix = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)

和動態的方法:

var matrix = [[Int]]() // creates an empty matrix
var row = [Int]() // fill this row
matrix.append(row) // add this row

您的問題可能是由於早期版本的Swift或Xcode Beta的缺陷造成的。 在2014年8月21日使用Xcode版本6.0(6A279r),您的代碼按此預期使用此輸出:

column: 0 row: 0 value:1.0
column: 0 row: 1 value:4.0
column: 0 row: 2 value:7.0
column: 1 row: 0 value:2.0
column: 1 row: 1 value:5.0
column: 1 row: 2 value:8.0
column: 2 row: 0 value:3.0
column: 2 row: 1 value:6.0
column: 2 row: 2 value:9.0

我只是將您的代碼復制並粘貼到Swift游樂場並定義了兩個常量:

let NumColumns = 3, NumRows = 3

使用http://blog.trolieb.com/trouble-multidimensional-arrays-swift/作為開始,我將generics添加到我的:

class Array2DTyped<T>{

var cols:Int, rows:Int
var matrix:[T]

init(cols:Int, rows:Int, defaultValue:T){
    self.cols = cols
    self.rows = rows
    matrix = Array(count:cols*rows,repeatedValue:defaultValue)
}

subscript(col:Int, row:Int) -> T {
    get{
        return matrix[cols * row + col]
    }
    set{
        matrix[cols * row + col] = newValue
    }
}

func colCount() -> Int {
    return self.cols
}

func rowCount() -> Int {
    return self.rows
}
}

你正在創建一個由三個元素組成的數組,並將所有三個元素分配給同一個東西,它本身就是一個由三個元素組成的數組(三個雙打)。

進行修改時,您將修改內部數組中的浮動。

您創建矩陣的原始邏輯確實是正確的,它甚至可以在Swift 2中運行。問題是在打印循環中,您可以反轉行和列變量。 如果您將其更改為:

for row in 0...2 {
  for column in 0...2 {
    print("column: \(column) row: \(row) value:\(array[column][row])")

  }
}

你會得到正確的結果。 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM