Your task is to complete the implementation of a generic Matrix class. A matrix is a two-dimensional arrangement of elements. You access elements with a row and column index. For example,

Matrix<String> tttBoard = new Matrix<String>(3, 3);
tttBoard.put(0, 0, "x"); if (tttBoard.get(1, 2).equals("o")) . . .

If the matrix has many rows and columns but few elements, it doesn't make sense to allocate a large two-dimensional array, most of whose entries are null. Instead, we will only store the non-null entries in a map. We store the (i, j) element at the key with value i * columns + j. For example, in a 10 x 10 matrix, the (3,4) element has key 3 * 10 + 4 = 34.

Complete the implementations of the get and put method below.

Complete the following file:

Matrix.java

import java.util.Map; import java.util.TreeMap; public class Matrix<T> { public Matrix(int rows, int columns) { this.rows = rows; this.columns = columns; elements = new TreeMap<Integer, T>(); } // add your get and put methods here private Map<Integer, T> elements; private int rows; private int columns; // the following method is used to check your work public static String check(int r, int c, String s) { int rows = 3; int columns = 4; Matrix<String> m = new Matrix<String>(rows, columns); // add letters of s diagonally for (int i = 0; i < s.length(); i++) { m.put(r, c, s.substring(i, i + 1)); r++; if (r >= rows) r = 0; c++; if (c >= columns) c = 0; } // make string representing matrix content String t = ""; for (int i = 0; i < rows; i++) for (int j = 0; j < columns; j++) if (m.get(i, j) == null) t += "."; else t += m.get(i, j); return t; } }