数据结构01--稀疏数组
稀疏数组
-
基本介绍:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
第一行:记录数组共有几行,几列,多少个不同的值;
把具有不同值的元素的行,列,值,记录在一个小规模的数组中,从而缩小程序的规模。
-
-
记录数组一共有几行几列,有多少个不同的值;
-
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
-
-
示例:五子棋的存盘退出及续上盘功能。存在很多的无意义数据(0),由此提出稀疏数组。
行 列 值 11 11 2 1 2 1 2 3 2
转换思路
-
二维数组转稀疏数组
-
遍历原始的二维数组,得到有效数据的个数为notZeroValueNumberCalc;
-
根据sum来创建稀疏数组sparseArr int[notZeroValueNumberCalc+1] [3];
-
将二维数组的有效数据存入到稀疏数组中;
-
-
稀疏数组转二维数组
-
先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组;
-
在读取稀疏数组后几行的数据,并赋给原始的二维数组即可。

1 import java.io.IOException; 2 import java.util.Arrays; 3 4 public class SparseArray { 5 public static void main(String[] args) throws IOException { 6 // 创建一个原始二维数组 11 * 11 7 // 0:无棋子 1:黑子 2:白子 8 int chessArr1[][] = new int[11][11]; 9 chessArr1[1][2] = 1; 10 chessArr1[2][3] = 2; 11 chessArr1[8][8] = 2; 12 chessArr1[4][10] = 2; 13 chessArr1[4][10] = 1; 14 chessArr1[10][0] = 1; 15 // 原始二维数组 增强循环输出 16 System.out.println("=====TEST0====="); 17 //Test Unit 18 for (int[] tmpArr :chessArr1) { 19 for (int i :tmpArr) { 20 System.out.print(i+"\t"); 21 } 22 System.out.println(); 23 } 24 25 System.out.println("=======Transfer Begin======="); 26 //==开始转换 27 //1 遍历原始的二维数组,得到有效数据的个数为notNullValueNumberCalc 28 int notZeroValueNumberCalc = 0; 29 for (int[] tmpRow:chessArr1) { 30 for (int i:tmpRow) { 31 if (0!=i) notZeroValueNumberCalc++; 32 } 33 } 34 35 //2 根据notNullValueNumberCalc来创建稀疏数组SparseArr int[sum+1] [3] 36 int sparseArr[][] = new int[notZeroValueNumberCalc+1][3]; 37 sparseArr[0][0] = chessArr1.length; //获取行数 38 sparseArr[0][1] = chessArr1[0].length; //将第一行抽取出来,获取一维数组的长度==>列数 39 sparseArr[0][2] = notZeroValueNumberCalc; //存储遍历得到的非0个数 40 41 //3 将二维数组的有效数据存入到稀疏数组中 42 //定义行列索引变量 43 Integer inputSparseArrNum = 0; 44 //循环遍历,当值非0时,将行列索引赋值给变量并存入稀疏数组中,再继续遍历 45 for (int row = 0; row < sparseArr[0][0]; row++) { 46 for (int col = 0; col < sparseArr[0][1]; col++) { 47 if (chessArr1[row][col]!=0){ 48 inputSparseArrNum++; 49 sparseArr[inputSparseArrNum][0] = row; 50 sparseArr[inputSparseArrNum][1] = col; 51 sparseArr[inputSparseArrNum][2] = chessArr1[row][col]; 52 } 53 } 54 } 55 System.out.println("=====TEST1====="); 56 //Test Unit 57 for (int[] tmpArr :sparseArr) { 58 for (int i :tmpArr) { 59 System.out.print(i+"\t"); 60 } 61 System.out.println(); 62 } 63 System.out.println("=======Transfer End======="); 64 //output 65 //Obj2LocalUtil.Array2Local(sparseArr); 66 System.out.println("=======Transfer Begin======="); 67 //逆向转换至二维数组 68 //1 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 69 int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; 70 //2 在读取稀疏数组后几行的数据,并赋给原始的二维数组 71 //从稀疏数组的第2行开始遍历,第一行已用于创建二维数组 72 for (int row = 1; row < sparseArr.length; row++) { 73 chessArr2[sparseArr[row][0]][sparseArr[row][1]] = sparseArr[row][2]; 74 } 75 76 System.out.println("=====TEST2====="); 77 //Test Unit 78 for (int[] tmpArr :chessArr2) { 79 for (int i :tmpArr) { 80 System.out.print(i+"\t"); 81 } 82 System.out.println(); 83 } 84 System.out.println("=======Transfer End======="); 85 } 86 }