【问题标题】:Populate a multidimensional array with a loop [duplicate]用循环填充多维数组[重复]
【发布时间】:2017-02-14 13:31:44
【问题描述】:

我正在尝试使用以下代码填充多维数组:

 var array = [[Int]]()
        for i in 0...3 {
            for j in 0...3{
                array[i][j] = i + j    <<- Error
            }

        }

但我得到一个错误:

fatal error: Index out of range

我做错了什么?

【问题讨论】:

    标签: swift for-loop multidimensional-array


    【解决方案1】:

    [[Int]] 不是多维数组。它是一个数组数组。那是非常不同的事情。例如,在数组数组中,每一行可能有不同数量的列。将嵌套数组用作多维数组通常是个坏主意,尤其是可变数组。修改通常非常低效,因为每次更改它都会导致大量复制。

    Swift 没有多维数组类型。如果你真的需要一个,你通常必须自己构建它,或者重新设计以避免它。如果它足够小,并且没有太大变化,那没什么大不了的,但不要让它们变大。

    也就是说,问题在于元素 [0][0] 不存在,因为您没有创建它。在使用它之前,您需要以这种方式初始化数组:

    var array = Array(repeating: Array(repeating: 0, count: 4), count: 4)
    

    这将创建一个由 4 个 4 个零组成的数组。

    如果您特别想要您描述的布局,可能更好的方法是映射,这可能会更有效(因为它不会不断修改嵌套数组):

    let array = (0...3).map { i in
        (0...3).map { j in
            return i + j
        }
    }
    

    【讨论】:

    • 感谢您的解释。
    【解决方案2】:

    调用array[i][j] 是针对已经存在的元素。您不能使用它来初始化数组,因为目前它只是一个空数组。您应该改用.append。请记住,这实际上不是像 Rob Napier 所说的多维数组,但它在这种情况下实现了相同的目标。试试这样的:

    var array = [[Int]]()
    for i in 0...3 {
    
        var subArray = [Int]()
        for j in 0...3 {
            subArray.append(i + j)
        }
    
        array.append(subArray)
    }
    

    打印出来:

    [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

    同样,这可能不是最好的方法,但这正是您在 Swift 中可以做到的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2022-10-07
      • 1970-01-01
      • 2021-12-03
      • 2023-01-26
      相关资源
      最近更新 更多