稀疏数组

需求:编写五子棋游戏中,有存盘退出和续上盘的功能。

分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。

解决:稀疏数组

 

 

public class Demo04 {        //稀疏数组     public static void main(String[] args) {          System.out.println(==============================);          int[][] nums1 = new int[11][11];         //0:无子;1:黑子;2:白子;         nums1[1][2]=1;         nums1[2][3]=2;          //输出原棋盘         printArrays(nums1);          System.out.println(==============================);          //有效棋子数         int count=0;         for (int i = 0; i < nums1.length; i++) {             for (int j = 0; j < nums1[i].length; j++) {                 if (nums1[i][j]!=0){                     count++;                 }             }         }          //稀疏数组         //count+1是因为多存了一个头,记录棋盘横坐标长度、纵坐标长度和有效记录数。         //头下面就开始记录横纵坐标和该位置的值。         int[][] nums2 = new int[count+1][3];          //第一列存横坐标,第二列存纵坐标,第三列存值         nums2[0][0]=11;         nums2[0][1]=11;         nums2[0][2]=count;          //稀疏数组游标row         int row=0;          for (int i = 0; i < nums1.length; i++) {             for (int j = 0; j < nums1[i].length; j++) {                 if (nums1[i][j]!=0){                     row++;                     nums2[row][0]=i;                     nums2[row][1]=j;                     nums2[row][2]=nums1[i][j];                 }             }         }          //输出稀疏数组         printArrays(nums2);           System.out.println(==============================);          //稀疏数组还原为原棋盘         int[][] nums3 = new int[nums2[0][0]][nums2[0][1]];          for (int i = 1; i < nums2.length; i++) {             for (int j = 0; j < nums2[i].length; j++) {                 if (nums2[i][j]!=0){                     nums3[nums2[i][0]][nums2[i][1]]=nums2[i][2];                 }             }         }           printArrays(nums3);     }      //打印二维数组     public static void printArrays(int[][] arrays){         for (int i = 0; i < arrays.length; i++) {             System.out.println(Arrays.toString(arrays[i]));         }     } }