一.稀疏数组
1.定义:稀疏数组可以看作普通数组的压缩,最好是无效数据远远大于有效数据量的数组
例如:下面是一个11*11的二维数组,有效数据为1和2
将它转为稀疏数组:
第一行的含义为:11行,11列,有效数据为2
第二行的含义:在第二行,第三列的有效数据为1
第三行含义:在第三行,第五列的有效数据为2
2.代码实现
int chessArr1[][] = new int[11][11]; chessArr1[1][2] = 1; chessArr1[2][3] = 2; //输出原始二维数组 System.out.println("原始的二维数组"); for (int[] row : chessArr1) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } //将二维数组转为稀疏数组 //1.先遍历二维数组得到有效数据个数 int sum=0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { sum++; } } } //2.创建对应的稀疏数组 int sparesArr[] []=new int[sum+1][3]; //给稀疏数组赋值 sparesArr[0][0] = 11; sparesArr[0][1] = 11; sparesArr[0][2] = sum; //遍历二维数组,将非0的值放到稀疏数组中 int count=0; for(int i=0;i<Arr1.length;i++){ for(int j=0;j<Arr1.length;j++){ if(Arr1[i][j]!=0){ count++; sparesArr[count][0] = i; sparesArr[count][1] = j; sparesArr[count][2] = chessArr1[i][j]; } } } //遍历稀疏数组 System.out.println("得到的稀疏数组为"); for (int i = 0; i < sparesArr.length; i++) { System.out.printf("%d\t%d\t%d\t\n", sparesArr[i][0], sparesArr[i][1], sparesArr[i][2]); } System.out.println();
3.将稀疏数组转成二维数组
int Arr2[][]=new int[sparesArr[0][0]][sparesArr[0][1]]; for(int i=0;i<sparesArr.length;i++){ Arr2[sparesArr[i][0]][sparesArr[i][1]]=sparesArr[i][2]; } //输出恢复后的二维数组 for(int [] row:Arr2){ for(int data:row){ System.out.printf("%d\t", data); } System.out.println(); }