Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 3 2d array of Int

It's actually a very simple question, but after an hour I can not solve my problem.

I need to create a 2d array of Int.

var arr = [[Int]]()
or
var arr : [[Int]] = []

tried to change value :

arr[x][y] = 1

fatal error: Index out of range

Should I use APPEND or I need specify the size of the array?

I'm confused..

like image 239
Mikhail Sein Avatar asked Oct 06 '16 14:10

Mikhail Sein


2 Answers

Not only you need to initialize both the array and subarrays before being able to assign any values, but also each array length must be greater than the index position you are trying to set.

This is because Swift does neither initialize the subarrays for you, neither increments the array length when assigning to an index.

For instance, the following code will fail:

var a = [Int]()
a[0] = 1
// fatal error: Index out of range

Instead, you can initialize an array with the number of elements you want to hold, filling it with a default value, zero for example:

var a = Array(repeating: 0, count: 100)
a[0] = 1
// a == [1, 0, 0, 0...]

To create an matrix of 100 by 100 initialized to 0 values:

var a = Array(repeating: Array(repeating: 0, count: 100), count: 100)
a[0][0] = 1

If you don't want to specify an initial size for your matrix, you can do it this way:

var a = [[Int]]()
a.append([])
a[0].append(1)
like image 162
Eneko Alonso Avatar answered Nov 18 '22 15:11

Eneko Alonso


It's not simple really. The line:

var arr : [[Int]] = []

Creates a variable of type Array of Array of Int and initially the array is empty. You need to populate this like any other other array in Swift.

Let's step back to a single array:

var row : [Int] = []

You now have an empty array. You can't just do:

row[6] = 10

You first have to add 7 values to the array before you can access the value at index 6 (the 7th value).

With your array of arrays, you need to fill in the outer array with a whole set of inner arrays. And each of those inner arrays need to be filled out with the proper number of values.

Here is one simple way to initialize your array of arrays assuming you want a pre-filled matrix with every value set to 0.

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

The outer count represents the number of rows and the inner count represents the number of columns. Adjust each as needed.

Now you can access any cell in the matrix:

matrix[x][y] = 1 // where x and y are from 0 to rows-1/columns-1
like image 24
rmaddy Avatar answered Nov 18 '22 16:11

rmaddy