左侧的是原始的二维数组,右侧的是稀疏数组。稀疏数组的第一行是记录原始二维数组的行和列以及二维数组的有效值的总和。从第一列开始将记录原始二维数组的位置以及值(行、列、值的形式记录)。(以上都是从零开始记录,例如第一行的行值是0)。
package com.wkj; /** * @author xxiao * @date 2022/2/3 - 22:23 */ public class SparseArray { public static void main(String[] args) { //创建一个原始二维数组11*11 //0:表示没有棋子,1:表示黑子,2:表示篮子 int chessArr1[][] = new int[11][11]; chessArr1[1][2] = 1; chessArr1[2][3] = 2; chessArr1[5][7] = 2; chessArr1[3][8] = 2; // 输出原始的二维数组 System.out.println("原始二维数组----------------"); for (int[] row:chessArr1){ for (int data:row){ System.out.print(data); System.out.print("\t"); } System.out.println(); } // 将二维数组转化为稀疏数组 // 1.先遍历二维数组有多少个有效值的总数 int sum = 0; for (int i = 0;i<11;i++){ for (int j = 0; j<11;j++){ if(chessArr1[i][j]!=0){ sum++; } } } System.out.println(sum); // 创建对应的稀疏数组 int sparseArray[][] = new int[sum+1][3]; // 给稀疏数组第一行赋值 sparseArray[0][0] = 11; sparseArray[0][1] = 11; sparseArray[0][2] = sum; // 遍历二维数组将非零的值存放到稀疏数组中 int count = 0; for (int i = 0;i<11;i++){ for (int j = 0; j<11;j++){ if(chessArr1[i][j]!=0){ count++; sparseArray[count][0] = i; sparseArray[count][1] = j; sparseArray[count][2] = chessArr1[i][j]; } } } System.out.println("得到的稀疏数组----------------"); // 得到的稀疏数组 for (int[] row:sparseArray){ for (int data:row){ System.out.print(data); System.out.print("\t"); } System.out.println(); } System.out.println("----------------"); // 将稀疏数组转化为二维数组 /* 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组,比如上面的 chessArr int[6][7] 2. 在读取稀疏数组后几行的数据,并赋予原始的二维数组*/ int chessArr2[][] = new int[sparseArray[0][0]][sparseArray[0][1]]; for (int i = 1;i<sparseArray.length;i++){ chessArr2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2]; } System.out.println("恢复后的二维数组----------------"); for (int[] row:chessArr2){ for (int data:row){ System.out.print(data); System.out.print("\t"); } System.out.println(); } } }
输出效果