Home CPSC 220

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:

12345
678910
1112131415

Would actually be stored in memory as follows:

12345 678910 1112131415

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.

Copyright © 2018 Ian Finlayson | Licensed under a Creative Commons Attribution 4.0 International License.