稀疏数组(一种数据结构)
package com.mypackage.array;public class Demo08 {public static void main(String[] args) {//1.创建一个二维数组 11*11// 0:没有棋子 1:黑棋 2:白棋int[][] array1 = new int[11][11];array1[1][2] = 1;array1[2][3] = 2;//一、输出原始的数组System.out.println("输出原始数组:");printArray2(array1);System.out.println("=============================");//二、转换为稀疏数组来保存//1.先获取有效值的个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (array1[i][j] != 0){sum++;}}}System.out.println("有效值的个数:"+sum);//2.再创建一个稀疏数组int[][] array2= new int[sum+1][3];array2[0][0] = 11;array2[0][1] = 11;array2[0][2] = sum;//3.遍历二维数组,将非零的值放进稀疏数组中int count = 0;for (int i = 0; i < array1.length; i++) {for (int j = 0; j < array1[i].length; j++) {if (array1[i][j] != 0){count ++;array2[count][0] = i;array2[count][1] = j;array2[count][2] = array1[i][j];}}}//4.输出稀疏数组System.out.println("输出稀疏数组:");printArray2(array2);System.out.println("=================");//三、将稀疏数组还原System.out.println("还原稀疏数组:");//1.先读取稀疏数组int[][] array3= new int[array2[0][0]][array2[0][1]];//2.给其中的元素还原它的值for (int i = 1; i < array2.length; i++) {array3[array2[i][0]][array2[i][1]] = array2[i][2];}//3.打印System.out.println("输出还原的数组:");printArray2(array3);}public static void printArray2(int[][] array){for (int[] ints : array) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println();}}
}//输出
输出原始数组:
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
=============================
有效值的个数:2
输出稀疏数组:
11 11 2
1 2 1
2 3 2
=================
还原稀疏数组:
输出还原的数组:
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
(心得分析)详细讲解一下代码如下:
package com.mypackage.array;public class Demo08 {public static void main(String[] args) {//1.创建一个二维数组 11*11// 0:没有棋子 1:黑棋 2:白棋int[][] array1 = new int[11][11];array1[1][2] = 1;array1[2][3] = 2;//一、输出原始的数组System.out.println("输出原始数组:");printArray2(array1);System.out.println("=============================");//二、转换为稀疏数组来保存//1.先获取有效值的个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (array1[i][j] != 0){sum++;}}}System.out.println("有效值的个数:"+sum);//2.再写出稀疏数组的第0行int[][] array2= new int[sum+1][3];array2[0][0] = 11;array2[0][1] = 11;array2[0][2] = sum;//3.遍历二维数组,将非零的值放进稀疏数组中,写出稀疏数组第0行以下的数/*二维数组的第一个括号代表行数,也就是竖着的长度;第二个括号代表列数,也就是横着的长度array.length代表的是二维数组的行数array[i].length才是代表它的列数*/int count = 0;for (int i = 0; i < array1.length; i++) {for (int j = 0; j < array1[i].length; j++) {if (array1[i][j] != 0){count ++;array2[count][0] = i;array2[count][1] = j;array2[count][2] = array1[i][j];}}}/*原数组如下:0 0 0 0 0 0 0 0 0 0 00 0 1 0 0 0 0 0 0 0 00 0 0 2 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0*//*在某一行中,遇到一个不为0的数,count++。比如:在第1行第2列中也就是i=1、j=2时就遇到了第一个不为0的数,那么此时count++变成1,稀疏数组的第1行的每个数就有了着落,稀疏数组的第1行第0列,也就是array2[1][0],它的值就是原数组的行数,也就是1;稀疏数组的第1行第1列,也就是array2[1][1],它的值就是原数组的列数,也就是2;稀疏数组的第1行第2列,也就是array2[1][2],它的值就是原数组的此位置的值,也就是1。*//*依次类推,得出稀疏数组如下:11 11 21 2 12 3 2*///4.输出稀疏数组System.out.println("输出稀疏数组:");printArray2(array2);System.out.println("=================");//三、将稀疏数组还原System.out.println("还原稀疏数组:");//1.先读取稀疏数组int[][] array3= new int[array2[0][0]][array2[0][1]];/*array[0][0]就是原数组的行数,array[0][1]就是原数组的列数。这一步读取稀疏数组,可以将原数组的长宽读取回来*///2.给其中的元素还原它的值for (int i = 1; i < array2.length; i++) {array3[array2[i][0]][array2[i][1]] = array2[i][2];}/*int i = 1,把i初始化为1,是因为稀疏数组的第1行开始才是有效值,稀疏数组的第0行是行数列数以及有效值个数。以上面的稀疏数组为例:11 11 21 2 12 3 2*//*i = 1时,array3[array[1][0]][array2[1][1]] = array2[1][2];也就是,array3[1][2] = 1;同样的,array3[2][3] = 2;这样,原数组的两个有效值就被填充回去了,我们只需要吧有效值的位置填充一下就行,剩下的位置直接默认被0填充满。*///3.打印System.out.println("输出还原的数组:");printArray2(array3);}//创建一个用来打印数组的方法,节省代码量public static void printArray2(int[][] array){for (int[] ints : array) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println();}}
}