See Intro to 2D arrays before attempting the exercises below.

Increasingly complex manipulations of 2D arrays have been featured on the AP Computer Science A Exam. This exercise includes traversals, swaps, and other manipulations of 2 dimensional arrays.

The Java files below include skeleton code for each method and a JUnit 5 tester for each method. See Running JUnit 5 tests.

TwoDArrayPractice.java
TwoDArrayPracticeTest.java

rowSwap method

/**
 * Swaps all values in the specified 2 rows of mat.
 * @param mat the array
 * @param rowAIndex the index of a row to be swapped
 * @param rowBIndex the index of a row to be swapped
 */
public static void rowSwap(int[][] mat, int rowAIndex, int rowBIndex)

rowSwap example

mat (before call):
10  9   8   7
6   5   4   3
2   1   -1  0

rowSwap(mat, 1, 2);

mat (after call):
10  9   8   7
2   1   -1  0
6   5   4   3

colSwap method

/**
 * Swaps all values in the specified 2 columns of mat.
 * @param mat the array
 * @param colAIndex the index of a column to be swapped
 * @param colBIndex the index of a column to be swapped
 */
public static void colSwap(int[][] mat, int colAIndex, int colBIndex)

colSwap example

mat (before call):
10  9   8   7
6   5   4   3
2   1   -1  0

colSwap(mat, 1, 3);

mat (after call):
10  7   8   9
6   3   4   5
2   0   -1  1

fillRowMajor method

/**
 * Returns an array with the specified number of rows and columns
 * containing the characters from str in row-major order. If str.length()
 * is greater than rows * cols, extra characters are ignored. If
 * str.length() is less than rows * cols, the remaining elements in the
 * returned array contain null.
 * 
 * @param str the string to be placed in an array
 * @param rows the number of rows in the array to be returned
 * @param cols the number of columns in the array to be returned
 * @return an array containing the characters from str in row-major order
 */
public static String[][] fillRowMajor(String str, int rows, int cols)

fillRowMajor example 1

String[][] result = fillRowMajor("stop whining", 3, 4);

result (after method call):
"s"     "t"     "o"     "p"
" "     "w"     "h"     "i"
"n"     "i"     "n"     "g"

fillRowMajor example 2

String[][] result = fillRowMajor("stop complaining", 3, 4);

result (after method call):
"s"     "t"     "o"     "p"
" "     "c"     "o"     "m"
"p"     "l"     "a"     "i"

fillRowMajor example 3

String[][] result = fillRowMajor("do more", 3, 4);

result (after method call):
"d"     "o"     " "     "m"
"o"     "r"     "e"     null
null    null    null    null

fillColumnMajor method

/**
 * Returns an array containing the elements of vals in column-major order.
 * 
 * Precondition: vals.length == rows * cols
 * 
 * @param vals the elements
 * @param rows the number of rows in the array to be returned
 * @param cols the number of columns in the array to be returned
 * @return an array containing the elements of vals in column-major order
 */
public static int[][] fillColumnMajor(int[] vals, int rows, int cols)

fillColumnMajor example

int[] source = new int[] {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1};

int[][] result = fillColumnMajor(source, 3, 4);

result (after method call):
10  7   4   1
9   6   3   0
8   5   2   -1

fillDownUp method

/**
 * Returns an array with the specified number of rows and columns that
 * contains the elements of vals in the order specified below. Elements
 * from vals are placed in the array by moving down the first column,
 * up the second column and so on.
 * 
 * Precondition: vals.length == rows * cols
 * 
 * @param vals the elements
 * @param rows the number of rows in the array to be returned
 * @param cols the number of columns in the array to be returned
 * @return an array containing the elements from vals in the specified order
 */
public static int[][] fillDownUp(int[] vals, int rows, int cols)

fillDownUp example

int[] source = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

int[][] result = fillDownUp(source, 3, 4);

result (after method call):
1   6   7   12
2   5   8   11
3   4   9   10

grow method

/**
 * Returns a larger array containing the same elements as the
 * mat. The elements from mat are read in row-major order and
 * appear in the new array in row-major order.
 * 
 * Precondition: newRows > mat.length && newCols > mat[0].length
 * 
 * @param mat the 2D array containing the original elements
 * @param newRows the number of rows in the new array
 * @param newCols the number of columns in the new array
 * @return a larger array containing the elements from mat in row-major order
 */
public static int[][] grow(int[][] mat, int newRows, int newCols)

grow example

mat (before method call):
10  9   8   7
6   5   4   3
2   1   -1  0

int[][] result = grow(mat, 4, 5);

result (after method call):
10  9   8   7   6
5   4   3   2   1
-1  0   0   0   0
0   0   0   0   0

crop method

/**
 * Returns a smaller array containing the elements in the specified
 * range of the mat.
 * 
 * @param mat the 2D array containing the original elements
 * @param startRow the first row to be kept
 * @param startCol the first column to be kept
 * @param endRow the last row to be kept
 * @param endCol the last column to be kept
 * @return a smaller array containing the specified elements
 */
public static int[][] crop(int[][] mat,
        int startRow, int startCol,
        int endRow, int endCol)

crop example

mat (before method call):
10  9   8   7
6   5   4   3
2   1   -1  0

int[][] result = crop(mat, 0, 1, 1, 2);

result (after method call):
9   8
5   4

invert method

/**
 * Returns an array containing the same elements as
 * mat but with the rows and columns reversed.
 *
 * @param mat the array
 * @return an array containing elements as described
 */
public static int[][] invert(int[][] mat)

invert example

mat (before method call);
10  9   8   7
6   5   4   3
2   1   -1  0

int[][] result = invert(mat);

result (after method call):
10  6   2
9   5   1
8   4   -1
7   3   0

consolidate method

/**
 * Consolidates the non-null elements in mat such
 * that they appear in row-major order, starting at
 * the top left.
 */
public static void consolidate(String[][] mat)

consolidate example 1

mat (before method call):
"a"     null    "b"     "c"     null
null    "d"     null    null    null
"e"     null    null    "f"     null

consolidate(mat);

mat (after method call):
"a"     "b"     "c"     "d"     "e"
"f"     null    null    null    null
null    null    null    null    null

consolidate example 2

mat (before method call):
"a"     null    "b"     "c"     null
null    "d"     "e"     null    "f"
"g"     "h"     "i"     "j"     "k"

consolidate(mat);

mat (after method call):
"a"     "b"     "c"     "d"     "e"
"f"     "g"     "h"     "i"     "j"
"k"     null    null    null    null

Solution & comments

See the 2D array practice solutions or review them with AP CS Tutor Brandon Horn.

Comment on 2D array practice exercises

Additional 2D array resources