package lesson01;
public class SparseArr {
public static void main(String[] args) {
int[][] arr = new int[11][11];
arr[1][2] = 1;
arr[2][3] = 2;
arr[3][4] = 3;
Tool tool = new Tool();
tool.look(arr);
int[][] paraseArr = tool.transToParase(arr);
tool.look(paraseArr);
int[][] arr2 = tool.transToNormal(paraseArr);
tool.look(arr);
}
}
class Tool {
public void look(int[][] arr) {
for (int[] i : arr) {
for (int j : i) {
System.out.printf("%d\t", j);
}
System.out.println("");
}
}
/*
转化为稀疏数组:
1. 遍历数组获得非0个数并创建数组
2. 获取原数组的行数和列数作为paraseArr[0]
3. 遍历原数组并补全稀疏数组
原数组 i = 1, j = 2 ---> 2行3列
原数组 i = 2, j = 3 ---> 3行4列
*/
public int[][] transToParase(int[][] arr) {
int[][] paraseArr; // 要返回的稀疏数组
int num = 0; // 非0元素个数
for (int[] i : arr) {
for (int j : i) {
if (j != 0) {
num += 1;
}
}
}
paraseArr = new int[num + 1][3]; // 创建稀疏数组
paraseArr[0][0] = arr.length;
paraseArr[0][1] = arr[0].length;
paraseArr[0][2] = num;
// 填补稀疏数组的其它元素
int count = 1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] != 0) {
paraseArr[count][0] = i + 1;
paraseArr[count][1] = j + 1;
paraseArr[count][2] = arr[i][j];
count++;
}
}
}
return paraseArr;
}
/*
将稀疏数组转化为正常数组
1. 根据稀疏数组paraseArr[0]创建数组
2. 对稀疏数组进行循环
arr[行数-1][列数-1] = paraseArr[i][2]
行数 = paraseArr[i][0]
列数 = paraseArr[i][1]
*/
public int[][] transToNormal(int[][] paraseArr) {
int[][] arr = new int[paraseArr[0][0]][paraseArr[0][1]];
for (int i = 1; i < paraseArr.length; i++) {
int row = paraseArr[i][0];
int col = paraseArr[i][1];
arr[row - 1][col - 1] = paraseArr[i][2];
}
return arr;
}
}
07-15
630
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-21
406
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)