思路:
创建一个可以保存非零值的数组:在第几行有,在第几列有,有哪些数字
第一行用来写,一共几行,一共几列,一共存几个数字
大致格式:
11(行) | 11(列) | 3(值) |
---|---|---|
5 | 5 | 5 |
5 | 6 | 2 |
5 | 7 | 0 |
1. 创建一个数组
- 写:一共几行几列
- 写:有哪些是不一样的值,比如非零
int[][] array1 = new int [11][11];
//11行,11列
array1[5][5]=5;
array1[5][6]=2;
array1[5][7]=0;
//列出来:第几行第几列是非0值,值是多少
2. 保存非零个数
- 用一个 int 类型来保存一个数字(保存共几个非零值)
:用for循环把数组里面的数字都走一遍,遇到非零就记录下来
int sum = 0; //之后要用,定义在循环外
for(int i = 0;i < 11;i++){
for(int j = 0;j < 11;j++){
if(array1[i][j]!=0){
sum++;
}
}
}
3. 创建一个稀疏数组的框架
-
第一行写:一共几行,一共几列,一共几个值
-
第二行开始记录:第几行,第几列,有值
故:稀疏数组应该(非零个数+1)个行,(3)个列
像开头表格一样
int[][] array2 = new int[sum+1][3];
//创建稀疏数组大框架
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//赋值稀疏数组的第一行
//没赋值的默认为0,之后马上赋值
4. 将非零的值赋值到稀疏数组框架里
-
用循环,把数组里面的数组全走一遍,遇到非零的就记录到稀疏数组里。也就是array2[ ] [ ]
-
用一个 int 类型来定位把数字记录到稀疏数组的第几行。
第1行在创建稀疏数组的时候已经赋值过了。
第一个非零,第2行
第二个非零,第3行
int count = 0;
for(int i = 0;i < array1.length;i++){
for(int j = 0;j < array1[i].length;j++){
//每一行数组中有几个元素:array1[i].length
if(array1[i][j]!=0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
//用count一行一行地赋值到稀疏数组array2里
}
}
}
5. 输出(打印)稀疏数组
- 用for循环输出
for(int i = 0;i < array2.length;i++){
System.out.println(array2[i][0]+"\t"
+array2[i][1]+"\t"
+array2[i][2]+"\t")
}
6. 还原稀疏数组
- 利用稀疏数组第一行,还原数组的大框架
int[][] array3 = new int[array2[0][0]][array2[0][1]];
- 给元素还原:第几行,第几列,什么值,在稀疏数组的每一行都能找到
for(int i = 1;i < array2.length;i++){
//从稀疏数组的第二行开始是值,也就是从1开始
array3[array[i][0]][array[i][1]]=array2[i][2];
}
- 把还原的数组,打印出来(单纯的打印用增强型for循环)
for(int[] ints : array3){
for(int[] anInt : ints){
System.out.print("anInt+"\t");
}
System.out.println(); //换行
}
思路步骤总结:
-
创建一个稀疏数组
-
保存非零的个数
-
创建一个稀疏数组框架
-
将非零的值,赋值到稀疏数组框架里
(用count,从稀疏数组第二行开始赋值)
-
输出(打印)稀疏数组
-
还原稀疏数组
(用稀疏数组第一行,还原大框架)
(利用稀疏数组的每一行数字,赋值)
(打印数组)