# Multi-Dimensional Arrays

## Overview

We have looked at arrays in one dimension. As we have seen, these can be used for lots of purposes.

Sometimes, however, we want to use a multi-dimensional array which is an array that has more than one index.

## Two-Dimensional Arrays

The simplest type of multi-dimensional array is a two dimensional one. In declaring a 2D array, we need to give two sizes, one for the number of rows, and one for the number of columns. For example:


int array[][] = new int[3][5];


This would create a two-dimensional grid that would look something like this:

When using the array, we specify both the row and column to be used:


array[0][2] = 9;
array[2][4] = 18;

Running this code would give us:
 9 18

You can also think of a multi-dimensional array as an "array of arrays".

## The Indexing Formula

Multi-dimensional arrays allow us to view our data in an intuitive way, but memory is really one dimensional. The 2D array:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Would actually be stored in memory as follows:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

In order to convert a two-dimensional address such as:


array[row][column]

Into a one-dimensional address, the compiler uses this formula:

array[row*COLUMNS + column]

Where "COLUMNS" is the number of columns in the array.

## Example: Times Table

The example below stores a multiplication table in a 2D array. It also demonstrates passing 2d arrays to and from functions:


class TimesTable {
// function which creates a 2d times table of a given size
public static int[][] createTimesTable(int size) {
int times_table[][];
times_table = new int[10][10];

for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
times_table[i][j] = (i + 1) * (j + 1);
}
}

return times_table;
}

// function which prints out a 2d table of integers
public static void printTimesTable(int table[][]) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(table[i][j] + " ");
}
System.out.println();
}
}

public static void main(String args[]) {
// build the times table
int times_table[][] = createTimesTable(10);

// print it out
printTimesTable(times_table);
}
}


This example also demonstrates nested for loops which is a very common pattern when using multi-dimensional arrays.

## Mazes

We can also use 2d arrays to represent mazes. Here, the start of the maze is the upper-left corner, and the finish is the bottom right of the maze.


class Maze {
// function which returns a (hard-coded) 2d maze
public static char[][] getMaze() {
return new char [] []
{
{'-','#','#','#','#','-','-','-','-','-','-','#','#','#','#','#','#','#'},
{'-','-','-','-','#','-','#','#','#','#','-','-','-','-','-','-','#','#'},
{'-','#','#','-','#','-','-','-','#','#','#','#','#','#','#','-','#','#'},
{'-','#','#','#','#','-','#','-','#','#','#','-','-','-','#','-','-','-'},
{'-','-','-','-','-','-','#','-','#','#','#','-','#','#','#','-','#','#'},
{'#','#','-','#','#','#','#','-','#','#','#','-','#','#','#','-','#','#'},
{'#','#','#','#','#','#','#','-','-','-','-','-','-','-','#','-','-','-'},
{'#','#','-','-','-','-','-','-','#','#','#','#','#','#','#','#','#','#'},
{'-','-','-','#','#','#','#','#','#','#','-','-','-','-','#','#','#','#'},
{'-','#','-','-','-','-','-','-','-','-','-','#','#','-','-','-','-','#'},
{'-','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
{'-','-','-','-','-','-','-','-','-','-','-','-','#','#','#','#','#','#'},
{'#','#','#','#','#','#','#','#','#','#','#','-','-','-','-','-','-','-'},
};
}

// function which prints out a 2d maze
public static void printMaze(char maze[][]) {
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[0].length; j++) {
System.out.print(maze[i][j]);
}
System.out.print('\n');
}
}

public static void main(String args[]) {
char maze[][] = getMaze();
printMaze(maze);
}
}


Any kind of grid-like information can be represented with 2d arrays.

## Solving a Maze

How can we develop an algorithm to solve a maze stored in a 2d array like this?





## Arrays of More than Two Dimensions

We can also have arrays that have even more dimensions. A three-dimensional array can be declared as:


int array[][][] = new int[10][10][10];


This will create a three dimensional array containing 1,000 integers.

Arrays of more than two dimensions are not very commonly done, but there is no limit to the number of dimensions you could create.