Friday, 10 November 2017

How to declare and Initialize two dimensional Array in Java with Example

An array of more than one dimension is known as multi-dimensional array. Two of the most common examples of multi-dimensional arrays are two and three dimensional array, known as 2D and 3D array, anything above is rare. I have never seen 4 dimensional arrays, even 3D arrays are not that common. Now question comes, when do use multi-dimensional array? Any real life example? Well, 2D arrays are very common on platform games like Super Mario Bros to represent screen or terrain; 2D arrays can also be used to represent structures like spreadsheet, or to draw board games like Chess, which requires 8x8 board, Checkers and  Tic-Tac-Toe, which requires 3 rows and 3 columns. Another popular application of multi-dimensional arrays are in matrix manipulation. For example to represent a 3x3 matrix you need a two dimensional array of 3 one dimensional array each containing 3 elements.

Similarly to represent 3x2 matrices you need 2 two dimensional array of one dimensional array of length 3. In other words, each row in two dimensional array is a one dimensional array.  Java truly doesn't support multi-dimensional array but allows you to create and use array of any number of dimensional.

Two dimensional array is actually an array of one dimensional array. This is unlike languages like C or FORTRAN, which allows Java array to have rows of varying length i.e. a multidimensional array can have 2 columns in one row and 3 columns in second.

Similar to one dimensional array, length of two dimensional array is also fixed. You can not change length of any array, i.e. number of rows and columns will remain fixed. A 2x2 array can hold total 4 elements and they can be accessed using row and column index e.g. a[0][0] will give you elements in first row and first column, similarly a[1][1] will give you elements from 2nd row and 2nd column. Just like normal array, index start at 0 and finishes at length -1.

How to Declare 2 Dimensional Array in Java


If you know how to create one dimensional array and fact that multi-dimensional arrays are just array of array in Java, then creating a 2 dimensional array is very easy. Instead of one bracket, you will use two e.g. int[][] is a two dimensional integer array. You can define a 2D array in Java as follows :

int[][] multiples = new int[4][2];     // 2D integer array with 4 rows and 2 columns
String[][] cities = new String[3][3];  // 2D String array with 3 rows and 3 columns

By the way when you initially declare a two dimensional array, you must remember to specify first dimension, for example following array declaration is illegal in Java.

 int[][] wrong = new int[][]; // not OK, you must specify 1st dimension
 int[][] right = new int[2][]; // OK

The first expression will throw "Variable must provide either dimension expressions or an array initializer" error at compile time. On the other hand second dimension is optional and even if you don't specify compiler will not complain, as shown below :

String[][] myArray = new String[5][]; // OK
String[][] yourArray = new String[5][4]; // OK

This is possible because a two dimensional array in Java is nothing but an array of one dimensional array, because of this, you can also create a two dimensional array where individual one dimensional arrays has different length, as seen in following example.
class TwoDimensionalArray {

    public static void main(String[] args) {
        String[][] salutation = {
            {"Mr. ", "Mrs. ", "Ms. "},
            {"Kumar"}
        };

        // Mr. Kumar
        System.out.println(salutation[0][0] + salutation[1][0]);

        // Mrs. Kumar
        System.out.println(salutation[0][1] + salutation[1][0]);
    }
}

The output from this program is:

Mr. Kumar
Mrs. Kumar

In this example, you can see that salutation is a 2D array but its first row has 3 elements while second row has just one element.

You can access elements of a two dimensional array either by using both indexes or just one index. For example salutation[0][1] represent a Single String in Java, while salutation[0]  represent a one dimensional array ( a single row in the 2 dimensional array).

How to Initialize Two Dimensional Array in Java


So far we have just declared and created the array, we haven't initialized them. Which means all elements of array has their default values e.g. zero for array of integral values e.g. byte, short, char and int,  0.0 for floating point array e.g. float and double, false for boolean arrays and null for array of reference type e.g. String array elements. You can verify this by accessing first element of two dimensional array as multiples[0][0], which will print zero, as shown below.

           boolean[][] booleans = new boolean[2][2];
           System.out.println("booleans[0][0] : " + booleans[0][0]);
         
           byte[][] bytes = new byte[2][2];
           System.out.println("bytes[0][0] : " + bytes[0][0]);
         
           char[][] chars = new char[1][1];
           System.out.println("chars[0][0] : " +  (int)chars[0][0]);
         
           short[][] shorts = new short[2][2];
           System.out.println("short[0][0] : " + shorts[0][0]);
         
           int[][] ints = new int[3][2];
           System.out.println("ints[0][0] : " + ints[0][0]);
         
           long[][] longs = new long[2][2];
           System.out.println("longs[0][0] : " + longs[0][0]);
         
           float[][] floats = new float[1][2];
           System.out.println("floats[0][0] : " + floats[0][0]);
         
           double[][] doubles = new double[2][2];
           System.out.println("doubles[0][0] : " + doubles[0][0]);
         
           Object[][] objects = new Object[2][2];
           System.out.println("objects[0][0] : " + objects[0][0]);

           Output
           booleans[0][0] : false
           bytes[0][0] : 0
           chars[0][0] : 0
           short[0][0] : 0
           ints[0][0] : 0
           longs[0][0] : 0
           floats[0][0] : 0.0
           doubles[0][0] : 0.0
           objects[0][0] : null

You can see default values of different types of primitive arrays here. Character array is bit tricky because if you print 0 as character it will print a null character and that's why I have used it's integer value by casting to int.

Now there are two ways to initialize a two dimensional array in Java, either by using array literal at the time of creation or by using nested for loop and going through each element. In next example we will learn how to loop through a two dimensional array, initialize each element and how to print a two dimensional array in Java.

       // initializing two dimensional array as literal
        String[][] names = {
                            {"Sam", "Smith"},
                            {"Robert", "Delgro"},
                            {"James", "Gosling"},
                           };

        // how to initialize two dimensional array in Java
        // using for loop
        int[][] board = new int[3][3];

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                board[i][j] = i + j;
            }
        }

In first example, we have created and initialized String array using array literal, while in second example we have created a two dimensional array board, and later initialized it by looping through the array.

How to Loop and Print 2D array in Java


If you want to access each element of a two dimensional array, then you need to iterate through two dimensional array using two for loops. Why? because you need two indexes to access individual element from 2D array. You can either use advanced for each loop or classic for loop with counter. Second one is more powerful as it provides explicit counter which can be used as indexes. In order to print contents of a two dimensional array, you can either use this method or can use Arrays.deepToString() method, which will return a String version of all elements of a 2D array, as shown in following example.
import java.util.Arrays;

/**
 * Java Program to initialize and print two dimensional array in Java.
 *
 * @author WINDOWS 8
 *
 */
class Basics {

    public static void main(String args[]) {
     
        // initializing two dimensional array as literal
        String[][] names = {
                            {"John", "Smith"},
                            {"Javin", "Paul"},
                            {"James", "Gosling"},
                           };

        // how to initialize two dimensional array in Java
        // using for loop
        int[][] board = new int[3][3];

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                board[i][j] = i + j;
            }
        }

        // now let's print a two dimensional array in Java
        for (int[] a : board) {
            for (int i : a) {
                System.out.print(i + "\t");
            }
            System.out.println("\n");
        }
     
        // printing 2D array using Arrays.deepToString() method
        System.out.println("another way to print 2D arrays");
        System.out.println(Arrays.deepToString(board));

    }

}
Output:
0   1   2 

1   2   3 

2   3   4 

another way to print 2D arrays
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]

to learn more about printing array elements, see how to print array in Java

Important Points about Multi-dimensional Array in Java


1)  Java doesn't support multi-dimensional array in true sense. In a true two dimensional array all the elements of array occupy a contiguous block of memory , but that's not true in Java. Instead a multi-dimensional array is an array of array. For example two dimensional array in Java is simply an array of one dimensional array like String[][] is an array of array of String[] or "array of array of strings".  This diagram shows how exactly two dimensional arrays are stored in Java :

Oracle Java Certifications, Oracle Java Tutorials and Materials

2) Because of above reason, second dimension in array is optional in Java. You can create a two dimensional array without specifying both dimension e.g. int[4][] is valid array declaration. It also allows you  create multi-dimensional array whose rows can vary in length, as we have seen in our second example.

3) While creating two dimensional or three dimensional array in Java, first dimension is must, without that compile will throw error e.g. int[][3] is Not Ok but int[3][] is Ok.

4) Two dimensional array is very useful data structure in game programming. You can use it on tile based game e.g. Super Mario Bros to draw terrain, background and other object, on games like Tetris to represent playing area. 2D array is also very useful in matrix manipulation. You can use 2D array to represent any matrix and perform addition, multiplication and other operations. 2D array can also be used to represent any object in plain using X and Y coordinate. Similarly 3D arrays can be used to represent things in three dimensional space using X, Y and Z coordinates. Some of the popular example of two dimensional arrays are chess board, checkers board and other board games which has slots. You can view chess board as an array of 8 rows and 8 columns.

Oracle Java Certifications, Oracle Java Tutorials and Materials

5) There are multiple ways to define and initialize multidimensional array in Java, you can either initialise them using in the line of declaration or some time later using a nested for loop. You will need as many for loop as many dimension of array you have. For example to explicitly initialize a three dimensional array you will need three nested for loops. On other hand, to initialize a 2D array, you just need two nested for loops.

6) In a two dimensional array like int[][] numbers = new int[3][2], there are three rows and two columns. You can also visualize it like 3 integer array of length 2. You can find number of rows using numbers.length and number of columns using numbers[0].length expression, as shown in below example. This is also very useful while iterating over two dimensional array in Java.

int[][] primes = new int[3][2];

int rows = primes.length; // 3
int cols = primes[0].length; // 2
     
System.out.printf("int[3][2] has %s rows and %d columns %n", rows, cols);
     
Output : int[3][2] has 3 rows and 2 columns

That's all about multi-dimensional array in Java. It is one of the useful data structure, especially to represent two dimensional things e.g. matrix. It is also very useful to build tile based games. By the way,  It's worth to remember that Java doesn't support true multi-dimensional array, instead they are represented as "array of array".