# 2D arrays 2
---
# Agenda
- Revision
- Transpose
- Reverse every row in the given matrix
- Rotate by 90
- Intro to 2D ArrayList
- Syntax
- Functions
- Return even elements from everyrow.
---
# Question
How do you declare an int 2D array in Java?
# Choices
- [x] int[][] mat = new int[rows][cols]
- [ ] int[][] mat = new int[cols][rows]
- [ ] int[][] mat = new int[rows][rows]
- [ ] int[][] mat = new int[cols][cols]
---
# Question
How do you get the no. of rows in a 2D matrix mat?
# Choices
- [x] mat.length
- [ ] mat.length()
- [ ] mat.size
- [ ] mat.size()
---
# Question
How do you get the number of columns in a 2D matrix for row index x?
# Choices
- [ ] mat[x].length()
- [x] mat[x].length
- [ ] mat[x].size
- [ ] mat[x].size()
---
# Question
```java
int[][] nums = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
1 2 3
4 5 6
7 8 9
System.out.println(nums[1][2]);
```
# Choices
- [ ] 4
- [ ] 5
- [x] 6
- [ ] ArrayIndexOutOfBoundsException
---
### Transpose
#### Given an rectangular matrix return the transpose of the matrix
> Rectangular matrix is matrix having number of rows not equal to number of columns
> Transpose of the matrix is new matrix in which the row of certain number in old matrix is converted to column of that particular number in new matrix like -
> >Row 1 of old matrix ---> column 1 of new matrix
> > Row 2 of old matrix ---> column 2 of new matrix
> > and so on...
#### Example 1
`mat[3][5]`
| 1 | 2 | 3 | 4 | 5 |
|:---:|:---:|:---:|:---:|:---:|
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
#### Explaination and solution
Intial matrix :-
`mat[3][5]`
| 1 | 2 | 3 | 4 | 5 |
|:---:|:---:|:---:|:---:|:---:|
| 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 |
Step 1 :- convert row 1 of intial to column 1
| 1 |
|:---:|
| 2 |
| 3 |
| 4 |
| 5 |
Step 2:- convert row 2 of intial to column 2
| 1 | 6 |
|:---:|:---:|
| 2 | 7 |
| 3 | 8 |
| 4 | 9 |
| 5 | 10 |
Step 3 :- convert row 3 of intial to column 3
| 1 | 6 | 11 |
|:---:|:---:|:---:|
| 2 | 7 | 12 |
| 3 | 8 | 13 |
| 4 | 9 | 14 |
| 5 | 10 | 15 |
Transpose of matrix is :-
| 1 | 6 | 11 |
|:---:|:---:|:---:|
| 2 | 7 | 12 |
| 3 | 8 | 13 |
| 4 | 9 | 14 |
| 5 | 10 | 15 |
#### Example 2
`mat[3][4]`
| 1 | 2 | 3 | 4 |
|:---:|:---:|:---:|:---:|
| 6 | 7 | 8 | 9 |
| 11 | 12 | 13 | 14 |
#### Explanation and solution
Transpose of matrix is :-
| 1 | 6 | 11 |
|:---:|:---:|:---:|
| 2 | 7 | 12 |
| 3 | 8 | 13 |
| 4 | 9 | 14 |
---
# Question
For a rectangular matrix, can we have the transpose in the same matrix?
# Choices
- [ ] Yes
- [x] No we need new matrix
- [ ] Maybe
---
# Question
If dimensions of a matrix A is ( N x M ), and it is declared as int mat[][] = new int[N][M];
How will the transpose be declared?
# Choices
- [ ] int transpose[] = new int[N][M];
- [ ] int transpose[][] = new int[N][M];
- [x] int transpose[][] = new int[M][N];
---
# Question
What will be the transpose of this matrix?
```java
10, 20, 30
14, 15, 18
```
# Choices
- [x] 10,14<br>20,15<br>30,18
- [ ] 10,20<br>30,14<br>15,18
- [ ] I am confused about what is transpose :(
---
#### Observations :-
* if we observe example 1
* Element at row 0 and column 1 in matrix mat becomes Element at column 0 and row 1 in transpose.
* similarly mat[2][3] ---> newMat[3][2]
* mat[1][4] ---> newMat[4][1]
* Is there any pattern between the position of element in intial matrix and tranpose matrix ?
* On observing we can say that :-
<div class="alert alert-block alert-warning">
Transpose[i][j] = Mat[j][i]
</div>
<div class="alert alert-block alert-warning">
**If dimensions of Mat are MxN then dimensions of transpose would be NxM**
</div>
#### Code
```java
static int[][] transposeMatrix(int[][] Mat) {
int m = Mat.length;
int n = Mat[0].length;
int[][] ans = new int[n][m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
ans[j][i] = Mat[i][j];
}
}
return ans;
}
```
---
### Reverse every row
Given a matrix reverse every row of matrix and return the same matrix
#### Example 1
`mat[3][5]`
| 3 | 2 | 6 | 1 | 9 |
|:---:|:---:|:---:|:---:|:---:|
| 14 | 18 | 2 | 4 | 10 |
| 5 | 6 | 3 | 9 | 8 |
#### Explanation and solution
Initial matrix :-
`mat[3][5]`
| 3 | 2 | 6 | 1 | 9 |
|:---:|:---:|:---:|:---:|:---:|
| 14 | 18 | 2 | 4 | 10 |
| 5 | 6 | 3 | 9 | 8 |
Step 1 :- Reverse row 1 of matrix
| 9 | 1 | 6 | 2 | 3 |
|:---:|:---:|:---:|:---:|:---:|
| 14 | 18 | 2 | 4 | 10 |
| 5 | 6 | 3 | 9 | 8 |
Step 2 :- Reverse row 2 of matrix
| 9 | 1 | 6 | 2 | 3 |
|:---:|:---:|:---:|:---:|:---:|
| 10 | 4 | 2 | 18 | 14 |
| 5 | 6 | 3 | 9 | 8 |
Step 4 :- Reverse row 3 of matrix
| 9 | 1 | 6 | 2 | 3 |
|:---:|:---:|:---:|:---:|:---:|
| 10 | 4 | 2 | 18 | 14 |
| 8 | 9 | 3 | 6 | 5 |
#### Example 2
`mat[3][4]`
| 1 | 2 | 3 | 4 |
|:---:|:---:|:---:|:---:|
| 6 | 7 | 8 | 9 |
| 11 | 12 | 13 | 14 |
#### Explanation and solution
| 4 | 3 | 2 | 1 |
|:---:|:---:|:---:|:---:|
| 9 | 8 | 7 | 6 |
| 14 | 13 | 12 | 11 |
---
# Question
What will be result if we reverse each row of this matrix?
```java
10, 20, 30
14, 15, 18
```
# Choices
- [ ] 10, 20, 30<br>14, 15, 18
- [ ] 20, 10, 30<br>14, 15, 18
- [ ] 10, 20, 30<br>18, 15, 14
- [x] 30, 20, 10<br>18, 15, 14
---
#### Approach
* Our approach should be to traverse each row reverse it.
* But how to reverse a row ?
**Reversing a single row:-**
* First element of the row is swapped with the last element of the row. Similarly, the second element of the array is swapped with the second last element of the array and so on.
* 
* But if keep on swapping we would end up with intial configuartion again
* So **we swap till e>s**
This way at the end of traversal, we will have the entire row reversed.
### Code
```java
static int[][] reverseEachRow(int[][] Mat) {
int m = Mat[0].length;
int n = Mat.length;
for (int i = 0; i < n; i++) {
int s = 0;
int e = m - 1;
while (e > s) {
// Swap elements in the current row
int temp = Mat[i][s];
Mat[i][s] = Mat[i][e];
Mat[i][e] = temp;
e--;
s++;
}
}
return Mat;
}
```
---
### Rotate by 90
Given a matrix rotate it by 90<sup>o</sup> in clockwise direction ?
#### Testcase

#### Solution

#### Example

#### Approach
* **First we take transpose of matrix. On taking transpose:-**

* **Reverse each row of transpose to get the solution**.

**Code**
```java
import java.util.*;
public class Main {
static int[][] transposeMatrix(int Mat[][]) {
int m = Mat.length;
int n = Mat[0].length;
int transposeMat[][] = new int[n][m];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
transposeMat[j][i] = Mat[i][j];
}
}
return transposeMat;
}
static int[][] reverseEachRow(int Mat[][]) {
int m = Mat[0].length;
int n = Mat.length;
for (int i = 0; i < n; i++) {
int s = 0;
int e = m - 1;
while (e > s) {
int temp = Mat[i][s];
Mat[i][s] = Mat[i][e];
Mat[i][e] = temp;
e--;
s++;
}
}
return Mat;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int Mat[][] = new int[3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
Mat[i][j] = sc.nextInt();
}
}
int transpose[][] = transposeMatrix(Mat);
int matRotatedClockwise90Degree[][] = reverseEachRow(transpose);
}
}
```
---
### Syntax
```java
ArrayList<Integer> l = new ArrayList<>();
```
Here each element in l is an integer.
### Properties
#### 1. add(element)
It is used to insert elements in ArrayList.
```java
l.add(20);
l.add(30);
l.add(40);
l.add(35);
```
ArrayList :-
| 20 | 30 | 40 | 35 |
|:---:|:---:|:---:|:---:|
#### 2. set(element)
It is used to update values at particular index in ArrayList.
```java
l.set(1, 80);
l.set(0, 90);
```
ArrayList :-
| 90 | 80 | 40 | 35 |
|:---:|:---:|:---:|:---:|
#### 3. get(index)
It is used to get values at particular index in ArrayList.
```java
print(l.get(2));
print(l.get(3));
```
Output :
```plaintext
40
50
```
#### 4. remove(index)
It is used to remove value at particular index in ArrayList.
```plaintext
l.remove(2);
```
ArrayList :-
| 90 | 80 | 35 |
|:---:|:---:|:---:|
**Note:**
```java
ArrayList<Integer> l = new ArrayList<>();
```
Each element in this ArrayList is of **Integer** type.
---
### 2D ArrayList
ArrayList of ArrayLists
### Syntax for 2D ArrayList
```java
ArrayList<ArrayList< Datatype>> a = new ArrayList<>();
```
Each element in this 2D ArrayList is of **ArrayList< Datatype>**
### How to add elememts in 2D ArrayList
```java
ArrayList<ArrayList<Integer>> arr = new ArrayList<>();
```
Here each Arraylist in arr is of type **ArrayList<Integer>**.
#### Pseudocode
```java
ArrayList<ArrayList<Integer>> arr = new ArrayList<>();
ArrayList<Integer> d1 = new ArrayList<>();
d1.add(10);
d1.add(20);
d1.add(30);
d1.add(40);
ArrayList<Integer> d2 = new ArrayList<>();
d2.add(-1);
d2.add(4);
d2.add(8);
ArrayList<Integer> d3 = new ArrayList<>();
d1.add(50);
d1.add(60);
d1.add(70);
d1.add(80);
```
Output:
```plaintext
{
{10,20,30,40},
arr : {-1,4,8},
{50,60,70,80}
}
```
### How to get elememts in 2D ArrayList
>Note: arr.get(i) = element at ith index.
#### Pseudocode
```java
System.out.println(arr.get(1));
System.out.println(arr.get(2));
```
Output:
```plaintext
{-1,4,8}
{50,60,70,80}
```
### How to access element from ith ArrayList at jth index
>Note: arr.get(i).get(j) = element at ith ArrayList and jth index.
#### Pseudocode
```java
System.out.println(arr.get(0).get(0));
System.out.println(arr.get(1).get(2));
System.out.println(arr.get(2).get(1));
```
Output:
```plaintext
10
8
60
```
### How to return no. of elements in ArrayList
#### Pseudocode
```java
System.out.println(arr.size());
System.out.println(arr.get(0).size());
System.out.println(arr.get(1).size());
```
Output:
```plaintext
3
4
3
```
### How to modify elements in ArrayList
#### Pseudocode
```java
System.out.println(arr.get(0).set(0,14));
System.out.println(arr.get(1).set(2,-9));
System.out.println(arr.get(2).set(0,20));
```
Output:
```plaintext
{
{14,20,30,40},
arr : {-1,4,-9},
{20,60,70,80}
}
```
---
### Problem 1
Print 2D ArrayList.
#### Pseudocode
```java
void print(ArrayList< ArrayList< Integer>> arr) {
int n = arr.size(); // Get the number of rows in the ArrayList
// Iterate through each row
for (int i = 0; i < n; i++) {
// Get the number of columns in the current row
int m = arr.get(i).size();
// Iterate through each element in the current row
for (int j = 0; j < m; j++) {
System.out.print(arr.get(i).get(j) + " ");
}
System.out.println();
}
}
```
#### Dry run

---
### Even numbers
Given a 2D ArrayList, return a 2D ArrayList which contains even number from every row.
#### Example 1
```java
arr = {
{3,10,2},
{2,7,6,9,4},
{18,20,11,6}
}
Ans = {
{10, 2}
{2,6,4}
{18,20,6}
}
```
#### Example 2
```java
arr = {
{3,6,2,9},
{2,4,8,10},
{3,9,7,15},
8,3,2,14,19},
}
Ans = {
{6,2}
{2,4,8,10}
{}
{8,2,14}
}
```
#### Observation
We will traverse every element in ArrayList and insert even numbers in output.
#### Pseudocode
```java
ArrayList<ArrayList<Integer>> even(ArrayList<>> arr){
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
int n = arr.size();
for(int i = 0; i < n; i++) {
ArrayList<Integer> l = new ArrayList<>();
int m = arr[i].get(i).size();
for(int j = 0; j < m; j++){
if( arr.get(i).get(j) % 2 == 0){
l.add(arr.get(i).get(j));
}
}
ans.add(l);
}
return ans;
}
```
---