【问题标题】:Multidimensional arrays in SwiftSwift 中的多维数组
【发布时间】:2014-07-25 22:23:27
【问题描述】:

编辑:正如 Adam Washington 指出的那样,从 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

看起来该行的最后一列正在覆盖其他列的值。

我说错了吗?

编辑:也许游乐场的照片会有所帮助:

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    您的问题可能是由于早期版本的 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

    【讨论】:

    • 是的 - 我认为他们确实在该领域有所改变。我已经编辑了这个问题。谢谢:)
    • 你把 println 改成了 print
    【解决方案2】:

    对于未来的读者,这是一个优雅的解决方案(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
    

    【讨论】:

    • var matrix:[[Int]] = [[Int]](repeating:[Int](repeating:0, count:5), count:5) // Swift 3
    【解决方案3】:

    您创建矩阵的原始逻辑确实是正确的,它甚至可以在 Swift 2 中使用。问题是在打印循环中,您将行和列变量颠倒了。如果您将其更改为:

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

    你会得到正确的结果。希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      使用http://blog.trolieb.com/trouble-multidimensional-arrays-swift/ 作为开始,我将泛型添加到我的:

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

      【讨论】:

      • 你能解释一下'matrix[cols * row + col]'是什么意思吗?
      • @Max_Power89 尝试在纸上画一个 3x3 矩阵,然后想象这个矩阵在一行上(所以第二行在第一行的末尾,依此类推)。基本上,当您位于第一列和第二行时,与位于第四项相同。这就是cols * row + col 的意思。
      • 这与我所做的非常相似。这种处理多维数组的特殊方式允许您仍然获得数组的一维版本,如果对数据集的操作独立于其行列位置,这将很有用。例如,如果每个单元格都包含 RGB 像素数据,并且您希望将其转换为黑白。
      • @johndpope 在您的要点中,您滚动遍历数组的行和列以定位元素。为什么不只搜索数组的一维版本并计算行列?行 = 索引/列,列 = 索引 % 列
      【解决方案5】:
      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)")
      

      【讨论】:

      • 是的,我可以看到以这种方式完成的声明有效,但我想声明数组而不初始化每一位。在 Swift Playground 中,我的声明有效,并显示了我希望它看起来的数组:[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] 但是如果我将 var a = Array(count:4, repeatedValue:Array(count:3, repeatedValue:Double())) 然后 a[1][1] = 99 然后 a 放入 Playground,我会得到结果 [[0.0, 99.0, 0.0], [0.0, 99.0, 0.0], [0.0, 99.0, 0.0]]跨度>
      • 在您的阵列创建中,您将创建一个阵列并重复相同的阵列三次。您没有创建三个唯一的数组。
      • 那么创建一个 52 行 27 列的多维数组的语法是什么?
      • @Caroline Double[][](count: 27, repeatedValue:Double[](count: 52, repeatedValue:Double()));
      【解决方案6】:

      正如其他答案所述,您正在向每一列添加相同的行数组。要创建多维数组,您必须使用循环

      var NumColumns = 27
      var NumRows = 52
      var array = Array<Array<Double>>()
      for column in 0..NumColumns {
          array.append(Array(count:NumRows, repeatedValue:Double()))
      }
      

      【讨论】:

      • Double[][](count: NumColumns, repeatedValue:Double[](count: NumRows, repeatedValue:Double())); 如果你不想循环
      • 从 beta 3 开始,语法略有不同。此外,这只会为您提供一些对值类型数组有用的东西——对于引用类型,您可以获得对同一对象的许多引用的数组。更多内容请参见this answer
      • 多维数组初始化语法给了我足够的适合我写了这个dev.iachieved.it/iachievedit/multidimensional-arrays-in-swift
      • @Literphor,新语法是[[Double]](count: NumColumns, repeatedValue:[Double](count: NumRows, repeatedValue:Double()));
      • 又改了?现在看起来应该是 repeating: 而不是 repeatedValue:repeating: 显然必须在 count: 之前
      【解决方案7】:

      您正在创建一个包含三个元素的数组并将所有三个分配给同一个对象,该对象本身就是一个包含三个元素(三个 Double)的数组。

      当您进行修改时,您正在修改内部数组中的浮点数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        相关资源
        最近更新 更多