

class Feb20 {

	public static void main(String[] args) {

		int[] arr1 = {7,2,1};
		int[] arr2 = {4,5,9};

		// A 2D array is an array of array references

		int[][] m1 = {{1,2,3}, {4,5,6}};

		int[][] m2 = {arr1, arr2};

		// the length of m1 is 2
		int len = m1.length;  

		// m1 holds int[]s
		int[] firstElm = m1[0];
		int[] secondElm = m1[1];

		// get lengths of m1's elements (int[])
		int firstLen = m1[0].length;
		int secondLen = m1[1].length;
		

		// m1[0] is an int[]
		// m1[0][1] is an int 
		int elm = m1[0][1];

		print2DArray(m1);

		// swap - proof that m1 holds references
		int[] temp = m1[0];
		m1[0] = m1[1];
		m1[1] = temp;

		print2DArray(m1);

		// if you change a value using a ref stored 
		// in the 2D array, the 2D array changes

		print2DArray(m2);

		arr1[1] = -1;

		print2DArray(m2);
	
		// we can dynamically create a 2D array
		// we must specify the number of rows, but
		// not how long each row is.

		int[][] m3 = new int[3][];	
		m3[0] = arr1;
		// m3[1] = {6,7,8};  cannot do this!
		m3[1] = new int[7];
		m3[2] = new int[0];  // empty array ok	

		print2DArray(m3);
	}

	static void print2DArray(int[][] m) {
		for(int[] row : m) {
			for(int elm : row) {
				System.out.print(elm + " ");
			}
			System.out.println();
		}
	}


}
