六、稀疏数组
需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
分析问题:因为该二维数组的很多值是默认值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])); } } }