稀疏数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
当我们使用上面的二维数组的时候就会发现有很多的0,这样就会记录一些没有意义的数据,消耗一些不必要的资源,我们解决的办法就是使用稀疏数组
- 当一个数组中大多元素都是0或者是一些相同的元素时,我们使用稀疏数组来保存该数组
- 稀疏数组记录该数组一共有几行几列,有几个不同的值
- 把具有不同值元素的行和列记录在一个新的小规模数组中,从而减少资源浪费
将上面的二维数组转化为稀疏数组
行 列 值
0 11 11 2 //这里显示了原数组有11行11列2个不同的值
1 2 3 1 //这里显示了在第二行第三列的值为1
2 3 4 2 //这里显示了在第三行第四列的值为2
java源代码
public static void main(String[] args) {
int[][] array=new int[11][11];
array[1][2]=1;
array[2][3]=2;
for(int[] a:array){
for (int b:a) {
System.out.print(b+"\t");
}
System.out.println();
}
int sum=0;
for (int i = 0; i < 11 ; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j]!=0){
sum++;
}
}
}
System.out.println("====================================");
System.out.println("一共有"+sum+"个不同数");
System.out.println("输出稀疏数组");
String[]array2=new String[3];
array2[0]="行";
array2[1]="列";
array2[2]="值";
for (String c:
array2) {
System.out.print(c+"\t");
}
int[][] array3=new int[sum+1][3];
array3[0][0]=11;
array3[0][1]=11;
array3[0][2]=sum;
int count=0;
for (int i = 0; i <11 ; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j]!=0) {
count++;
array3[count][0]=i;
array3[count][1]=j;
array3[count][2]=array[i][j];
}
}
}
System.out.println();
for(int[] d:array3){//自我理解是将二维数组array3中的第一行元素遍历给一维数组d,一维数组d再把每个元素遍历给整型e,再一个循环就是第二行了
//约等于array3[0][0],array3[0][1]...array3[0][10]给d[0],d[1].....d[10],,相当于这是外循环的第一遍
for (int e:d) {
System.out.print(e+"\t");
}
System.out.println();//每把一行输出完就换行
}
}
//我们也可以通过稀疏数组还原该数组
//还原数组
int[][] array4=new int[array3[0][0]][array3[0][1]];
for (int i = 1; i < array3.length ; i++) {
array4[array3[i][0]][array3[i][1]] = array3[i][2];
}
for(int[] f:array4){
for (int g:f) {
System.out.print(g+"\t");
}
System.out.println();
}
====================================
一共有2个数
输出稀疏数组
行 列 值
11 11 2
1 2 1
2 3 2