|--适用场景
当一个数组中有大量重复数字的时候可以使用稀疏数组来压缩这个数组,从而减少对资源的耗费
|--笔记

|--代码

1 1 package structure; 2 2 3 3 /** 4 4 * @auther::9527 5 5 * @Description: 稀疏数组 6 6 * @program: news_chapter06_02 7 7 * @create: 2019-10-01 17:26 8 8 */ 9 9 public class SparseArry { 1010 public static void main(String[] args) { 1111 //创建一个原始的二维数组 11*11 1212 // 0:代表没有棋子 1表示黑子 2表示蓝子 1313 int chessArr1[][]=new int[11][11]; 1414 chessArr1[1][2]=1; 1515 chessArr1[2][3]=2; 1616 chessArr1[4][5]=2; 1717 1818 //输出原始的二维数组 1919 System.out.println("原始的二维数组:"); 2020 for (int[] row :chessArr1) { 2121 for(int data:row) { 2222 System.out.printf("%d\t",data); 2323 } 2424 System.out.println(); 2525 } 2626 2727 //将二维数组 转 稀疏数组 2828 //1、遍历二维数组 得到非0数据的个数 2929 int sum = 0; //计数器 3030 for (int i=0;i<11;i++) { 3131 for(int j = 0; j<11;j++) { 3232 if(chessArr1[i][j]!=0) { 3333 sum++; 3434 } 3535 } 3636 } 3737 System.out.println("非0数字共有 "+sum+" 个"); 3838 3939 //2、创建对应的稀疏数组 4040 int sparseArr[][]=new int[sum+1][3]; //行数=有效数据量+1 列数=3 4141 //给稀疏数组赋值 第一行:依次存放:行、列、有效数据数量 4242 sparseArr[0][0]=11; 4343 sparseArr[0][1]=11; 4444 sparseArr[0][2]=sum; 4545 4646 //遍历二维数组,将非0的值存放到sparseArr中 4747 int count = 0; // 记录第几个数字时非0数据 4848 for(int i=0;i<11;i++) { 4949 for(int j=0;j<11;j++) { 5050 if(chessArr1[i][j]!=0) { 5151 count++; 5252 sparseArr[count][0]=i; //行坐标 5353 sparseArr[count][1]=j; //列坐标 5454 sparseArr[count][2]=chessArr1[i][j]; //坐标对应数值 5555 } 5656 } 5757 } 5858 5959 //输出稀疏数组的形式 6060 System.out.println("********-------我是分割线--------********"); 6161 System.out.println("得到的稀疏数组为:"); 6262 for(int i =0;i<sparseArr.length;i++) { 6363 System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]); 6464 } 6565 6666 6767 //将稀疏数组回复成原始的二维数组 6868 /** 6969 * 思路:1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组 7070 * 2、继续读取稀疏数组后几行的数据,并赋值给原始的二维数组 7171 */ 7272 //读取第一行 7373 int afterArr[][]=new int[sparseArr[0][0]][sparseArr[0][1]]; 7474 7575 //读取稀疏数组剩下的并赋值给二维数组,由于第一行存的是坐标信息,所以赋值从第二行开始 7676 for(int i=1;i<sparseArr.length;i++) { 7777 afterArr[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2]; 7878 } 7979 8080 System.out.println("**************************\n"); 8181 //输出一下还原的二维数组看下是否和原数组一致 8282 for(int []row:afterArr) { 8383 for(int data:row) { 8484 System.out.printf("%d\t",data); 8585 } 8686 System.out.println(); 8787 } 8888 } 8989 }
稀疏数组