Swift中的multidimensional array
编辑:正如亚当·华盛顿指出的那样,从Beta 6开始,这个代码是按原样运行的,所以这个问题不再相关。
我正在尝试创build并遍历一个二维数组:
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
它看起来好像该行中的最后一列正在覆盖其他列值。
我说错了吗?
编辑:也许从操场上的图片将有助于:
正如其他答案所述,您要为每列添加相同的行数组。 要创build一个multidimensional array,你必须使用一个循环
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)")
对于未来的读者,这里是一个优雅的解决scheme(5×5):
var matrix:[[Int]] = [[Int]](count:5, repeatedValue:[Int](count: 5, repeatedValue:0))
和一个dynamic的方法:
var matrix:[[Int]] = [[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),您的代码可以按照预期的方式使用此输出:
列:0行:0值:1.0 列:0行:1值:4.0 列:0行:2值:7.0 列:1行:0值:2.0 列:1行:1值:5.0 列:1行:2值:8.0 列:2行:0值:3.0 列:2行:1值:6.0 列:2行:2值:9.0
我只是复制和粘贴你的代码到一个Swift的操场上,并定义了两个常量:
让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 } }
您正在创build一个由三个元素组成的数组,并将这三个元素分配给同一个元素,而这个元素本身就是三个元素(三个双精度元素)的数组。
当你修改你正在修改内部数组中的浮动。
您创buildmatrix的原始逻辑确实是正确的,甚至可以在Swift 2中工作。问题是在打印循环中,行和列variables是颠倒的。 如果您将其更改为:
for row in 0...2 { for column in 0...2 { print("column: \(column) row: \(row) value:\(array[column][row])") } }
你会得到正确的结果。 希望这可以帮助!