需求:编写五子棋游戏中,有存盘退出和续上盘的功能;
分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据;
解决 --> 稀疏数组。
稀疏数组可以看做是普通数组的压缩,(该普通数组是值无效数据量远大于有效数据量的数组)。如:
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
其稀疏数组形式为:
row col value
11 11 2 1 2 1 2 3 2
处理方式:
记录数组一共有几行几列,有多少个不同的值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。代码实现:
public static void main(String[] args) { //1.创建一个二维数组 int[][] arr = new int[11][11]; arr[1][2] = 1; arr[2][3] = 2; System.out.println("输出原始数组:"); for (int[] ints : arr) { for (int anInt : ints) { System.out.print(anInt + "\t"); } System.out.println(); } //转换为稀疏数组保存: //获取有效值的个数: int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(arr[i][j] != 0){ sum++; } } } System.out.println("有效值的个数:" + sum); //2.创建一个稀疏数组的数组并保存值 int[][] arr2 = new int[sum+1][3]; arr2[0][0] = 11; arr2[0][1] = 11; arr2[0][2] = sum; //遍历二维数组,将非零的值,存放稀疏数组中 int count = 0; for (int i = 0; i < arr.length; i++) { for(int j = 0;j < arr[i].length; j++){ if(arr[i][j] != 0){ count++; arr2[count][0] = i; arr2[count][1] = j; arr2[count][2] = arr[i][j]; } } } //3.输出稀疏数组 System.out.println("输出稀疏数组:"); for (int i = 0; i < arr2.length; i++) { for (int j = 0; j < arr2[i].length; j++) { System.out.print(arr2[i][j] + "\t"); } System.out.println(); } System.out.println("还原:"); //1.读取稀疏数组的值 int[][] arr3 = new int[arr2[0][0]][arr2[0][1]]; //2.给其中的元素还原值 for(int i = 1; i < arr2.length; i++){ arr3[arr2[i][0]][arr2[i][1]] = arr2[i][2]; } //arr3[arr2[1][0]][arr2[1][1]] = arr2[1][2]; //arr3[arr2[2][0]][arr2[2][1]] = arr2[2][2]; //3.打印 for (int[] ints:arr3) { for (int anInt:ints){ System.out.print(anInt + "\t"); } System.out.println(); } }