稀疏数组
分析问题:因为该数组的很多值是默认为0,因此记录了很多没有意义的数据。
解决:稀疏数组
稀疏数组的介绍:
当一个数组中大部分元素为0时,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式是:
记录数组一共有几行几列,有多少个不同值。
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。
//压缩 public class test { public static void main(String[] args){ //创建一个二维数组 11行 * 11列 0:没有棋子, 1:黑棋 2:白棋 int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; //输出原始的数组 System.out.println("输出原始的数组"); // for (int[] ints : array1) {//array1.for // for (int anInt : ints) { // System.out.print(anInt + "\t"); // } // System.out.println(); // } for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { System.out.print(array1[i][j] + "\t"); } System.out.println(); } //转换为稀疏数组来保存 //获取有效值的个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(array1[i][j] != 0){ sum++; } } } System.out.println("有效值的个数:" + sum); //2.创建一个稀疏数组的数组 int[][] array2 = new int[sum + 1][3]; //固定的3列 array2[0][0] = 11; array2[0][1] = 11; array2[0][2] = sum;//表示存了多少个 //遍历二维数组,将非零的值,存放在稀疏数组中 int count = 0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { if(array1[i][j] != 0){ count++; array2[count][0] = i;//第count行的第0列存它的横坐标 array2[count][1] = j;//第count行的第1列存它的纵坐标 array2[count][2] = array1[i][j]; } } } //输出稀疏数组 System.out.println("输出稀疏数组"); for (int i = 0; i < array2.length; i++) { for (int j = 0; j < array2[i].length; j++) { System.out.print(array2[i][j] + "\t"); } System.out.println(); //换行 } }
//还原 public class test { public static void main(String[] args){ //创建一个二维数组 11 * 11 0:没有棋子, 1:黑棋 2:白棋 int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; //输出原始的数组 System.out.println("输出原始的数组"); for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { System.out.print(array1[i][j] + "\t"); } System.out.println(); } //转换为稀疏数组来保存 //获取有效值的个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(array1[i][j] != 0){ sum++; } } } System.out.println("有效值的个数:" + sum); //2.创建一个稀疏数组的数组 int[][] array2 = new int[sum + 1][3]; //固定的3列 array2[0][0] = 11; array2[0][1] = 11; array2[0][2] = sum;//表示存了多少个 //遍历二维数组,将非零的值,存放在稀疏数组中 int count = 0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { if(array1[i][j] != 0){ count++; array2[count][0] = i;//第count行的第0列存它的横坐标 array2[count][1] = j;//第count行的第1列存它的纵坐标 array2[count][2] = array1[i][j]; } } } //输出稀疏数组 // System.out.println("输出稀疏数组"); // for (int i = 0; i < array2.length; i++) { // for (int j = 0; j < array2[i].length; j++) { // System.out.print(array2[i][j] + "\t"); // } // System.out.println(); //换行 // } for (int i = 0; i < array2.length; i++) { System.out.println(array2[i][0] + "\t" +array2[i][1] + "\t" +array2[i][2] + "\t"); } //还原 System.out.println("==========================="); //读取稀疏数组的值 int[][] array3 = new int[array2[0][0]][array2[0][1]]; //给其中的元素还原值 for (int i = 1; i < array2.length; i++) {//从1开始,因为第0行为稀疏数组的头部信息,不用读 array3[array2[i][0]][array2[i][1]] = array2[i][2];//将arrays的值取出来,放到array3对应的位置中 } //打印出来 System.out.println("输出还原的数组"); for (int[] ints : array3) { for (int anInt : ints) { System.out.print(anInt + "\t"); } System.out.println();//换行 } } }