1.简单理解稀疏数组
可以把稀疏数组理解为只保存有效数据的一种数组,其针对的自然是有大量无用数据的数组。直接上图
原数组
稀疏数组
稀疏数组第一行类似于表格的表头,依次代表原数组的行数、列数、非零数个数(用零代表无用数据)。第一行之下的每一行都代表有一个非零数,第一列的数字代表非零数的行下标(数组下标从0开始),第二列数字代表非零数的列下标,第三列数就是非零数的实际值。
2.用Java代码实现普通二维数组到稀疏数组的转换及其逆过程
1 public class SparseArray { 2 public static void main(String[] args) throws IOException, ClassNotFoundException { 3 //创建一个二维数组 4 int arr1[][] = new int[11][11]; 5 arr1[1][2] = 1; 6 arr1[2][3] = 2; 7 arr1[2][4] = 1; 8 9 //输出打印 10 System.out.println("新的二维数组:"); 11 for (int[] rows : arr1) { 12 for (int i : rows) { 13 System.out.print(i+"\t"); 14 } 15 System.out.println(); 16 } 17 System.out.println(); 18 19 //获取二维数组的行数、列数 20 int rowNum = arr1.length; 21 int colNum = arr1[0].length; 22 //获取非零数个数 23 int valNum = 0; 24 for (int[] rows : arr1) { 25 for (int i : rows) { 26 if (i != 0){ 27 valNum++; 28 } 29 } 30 } 31 32 //依照获取的数据创建一个稀疏数组 33 int sparseArr[][] = new int[valNum+1][3]; 34 35 //设置第一行数据 36 sparseArr[0][0] = rowNum; 37 sparseArr[0][1] = colNum; 38 sparseArr[0][2] = valNum; 39 40 //计数器 41 int count = 0; 42 for (int i = 0; i < arr1.length; i++) { 43 for (int j = 0; j < arr1[i].length; j++) { 44 if (arr1[i][j] != 0){ 45 count++; 46 //第n个非零数在稀疏数组中的行下标为n+1 47 sparseArr[count][0] = i; 48 sparseArr[count][1] = j; 49 sparseArr[count][2] = arr1[i][j]; 50 } 51 } 52 } 53 54 //打印稀疏数组 55 for (int[] rows : sparseArr) { 56 for (int i : rows) { 57 System.out.print(i+"\t"); 58 } 59 System.out.println(); 60 } 61 System.out.println(); 62 63 //用对象输出流写入文件中 64 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\Files\\test\\sparseArr.txt")); 65 oos.writeObject(sparseArr); 66 oos.close(); 67 68 //用对象输入流读入文件中的对象 69 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G:\\Files\\test\\sparseArr.txt")); 70 int[][] sparseArr2 = (int[][]) ois.readObject(); 71 ois.close(); 72 73 //打印验证数据还原 74 System.out.println("还原的稀疏数组:"); 75 for (int[] rows : sparseArr2) { 76 for (int i : rows) { 77 System.out.print(i+"\t"); 78 } 79 System.out.println(); 80 } 81 System.out.println(); 82 83 84 //将稀疏数组还原为原来的二维数组 85 int arr2[][] = new int[sparseArr2[0][0]][sparseArr2[0][1]]; 86 for (int i = 1; i < sparseArr2.length; i++) { 87 arr2[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2]; 88 } 89 90 //再次打印验证 91 for (int[] rows : arr2) { 92 for (int i : rows) { 93 System.out.print(i+"\t"); 94 } 95 System.out.println(); 96 } 97 98 } 99 }