稀疏数组
1 public class SparseArray{ 2 public static void main(String[] args) { 3 // 一、二维数组 --> 稀疏数组 4 // 1.创建一个二维数组 size:11 * 11 5 // 0 表示棋盘 1 表示黑子 2 表示蓝子 6 7 int[][] chessArr1 = new int[11][11]; 8 chessArr1[1][2] = 1; 9 chessArr1[2][3] = 2; 10 11 System.out.println("输出原始二维数组为***************"); 12 13 for(int i = 0; i < chessArr1.length; i++){ 14 System.out.println(); 15 for(int j = 0; j < chessArr1[i].length; j++){ 16 System.out.printf("%d\t",chessArr1[i][j]); 17 } 18 System.out.printf("\n\n"); 19 } 20 21 // 2.遍历二维数组,得到非零数据元素的个数(sum) 22 int sum = 0; 32 for(int[] row: chessArr1){ 33 for(int data: row){ 34 if(0 != data){ 35 sum++; 36 } 37 } 38 } 39 System.out.println("输出原始二维数组非零数据元素的个数sum=" + sum); // sum = 2 40 41 42 // 3.创建存储原始二维数组的稀疏数组 43 /* 44 并用 row col value,分别来存储原始二维数组的行、列、非零数据元素的个数 45 作为稀疏数组的第 0 行 46 row col value 47 11 11 2 48 49 50 这里的理解:有n个非零数据元素,稀疏数组的行数就为 n + 1 ,列数为3. 51 即:稀疏数组中的每一行只存储一个非零数据元素 52 */ 53 // 3.1 创建size:(sum + 1) * 3 的稀疏数组 54 int[][] sparseArr = new int[sum + 1][3]; 55 56 // 3.2 用第 0 行存储原始二维数组的行、列、非零数据元素的个数 57 sparseArr[0][0] = 11; // 存储原始二维数组的行数 row 58 sparseArr[0][1] = 11; // 存储原始二维数组的行数 col 59 sparseArr[0][2] = sum; // 存储原始二维数组的非零数据元素的个数 sum 60 61 // 3.3 存储原始二维数组的非零数据元素(从稀疏数组的第 1 行开始赋值) 62 int count = 1; // 用于记录原始二维数组的非零数据元素的个数 63 for(int i = 0; i < chessArr1.length; i++){ 64 for(int j = 0; j < chessArr1[i].length; j++){ 65 if(0 != chessArr1[i][j]){ 66 67 sparseArr[count][0] = i; // 存储原始二维数组某个元素的初始(所在)行 68 sparseArr[count][1] = j; // 存储原始二维数组某个元素的初始(所在)列 69 sparseArr[count][2] = chessArr1[i][j]; // 存储原始二维数组某个元素的(具体)值 70 71 count++; 72 73 } 74 } 75 } 76 77 System.out.println("得到的稀疏数组为***************"); 78 // 3.4 输出(检验)一下稀疏数组所存储的内容是否正确 79 for(int[] row: sparseArr){ 80 System.out.println(); 81 for(int data: row){ 82 System.out.printf("%d\t",data); 83 } 84 System.out.println(); 85 } 86 87 88 89 // 稀疏数组 --> 二维数组 90 91 // 1. 由稀疏数组的第 0 行存储的内容,创建一个 size: sparseArr[0][0] * sparseArr[0][1]的 92 // 二维数组 93 94 int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]]; 95 96 // 2. 将稀疏数组中所存储的原始二维数组元素赋值给新的二维数组 97 // 这里从稀疏数组的第 1 行开始,因为起初创建稀疏数组时,也是从第 1 行开始存储元素的 98 for(int i = 1; i < sum + 1; i++){ 99 // 这里还原时,要清楚原始二维数组元素的所在行、列 100 // 从稀疏数组的第 1 行开始,每一行只存储一个非零数据元素!!! 101 /* 102 sparseArr[i][0] = row; 103 sparseArr[i][1] = col; 104 sparseArr[i][2] = value; 105 106 */ 107 chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; 108 } 109 110 System.out.println("输出还原后的二维数组为***********************"); 111 // 3. 输出还原后的二维数组 112 for(int[] chessArrData: chessArr2){ 113 System.out.println(); 114 for(int dataArr2: chessArrData){ 115 System.out.printf("%d\t",dataArr2); 116 } 117 System.out.println(); 118 } 119 120 121 } 122 }
/*
小结:
一、稀疏数组 --> 二维数组
1. 创建一个二维数组
2. 遍历原始二维数组,记录其中非零数据元素的个数 sum
3. 依据非零个数 sum 创建 size:(sum + 1) * 3 的稀疏数组
①稀疏数组的第 0 行 用来存储原始二维数组的 行数、列数、非零数据元素的个数
row col value
11 11 sum = 2
②从稀疏数组的第 1 行开始存储原始二维数组的非零元素
从稀疏数组中第一行开始:每一行只存储一个非零元素
int count = 1; // 记录非零元素的个数
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
二、二维数组 --> 稀疏数组
1. 依据稀疏数组第 0 行存储的内容,创建一个size: sparseArr[0][0] * sparseArr[0][1]的二维数组
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
2. 从稀疏数组的第 1 行开始,将所存储的原始二维数组数据元素赋值给新创建的二维数组
for(int i = 1; i < sum + 1; i++){
// 注意:i 是从 1 ~ sum + 1 (sum + 1 为稀疏数组创建时的总行数)
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
*/