稀疏数组

稀疏数组

package reck;

public class Demo07 {
   public static void main(String[] args) {
       int[][] arrays=new int[11][11];
       arrays[1][2]=1;
       arrays[2][3]=2;
       for (int i = 0; i < arrays.length; i++) {
           for (int j = 0; j < arrays[i].length; j++) {
               System.out.print(arrays[i][j]+"\t");

          }
           System.out.println();

      }
       //一,获取数组内有效值的个数
       int sum=0;//创建一个值用于存放有效值的个数
       for (int i = 0; i < arrays.length; i++) {
           for (int j = 0; j < arrays[i].length; j++) {
               /*写代码一定要严谨使用arrays.length也可以因为
               是11*11的二维数组但是如果是11*10呢?
               就会出现ArrayIndexOutOfBoundsException: 10越界错误
                */
               if(arrays[i][j]!=0){
                   sum++;

              }
          }
      }
       System.out.println("数组内有效值的个数为:"+sum);
       System.out.println("=========================");
       //二,创建一个稀疏数组即一个二维数组
       /*
       sum+1为行因为第一行要表示:行数-列数-值的个数
       即多占了一行所以要sum+1
       3为列,第一行要表示:行数-列数-值的个数
             第 n 行要表示:横坐标-纵坐标-值
        */
       //1.创建一个稀疏数组
       int[][] arrays2=new int[sum+1][3];
       //2.给创建的稀疏数组赋第一行的值即:行数-列数-值的个数
       arrays2[0][0] = arrays.length;//第一行第一个数:行值
       arrays2[0][1] = arrays[0].length;//第一行第二个数:列值
       //因为数组中每个数组长度都一样所以可以找[0]代替
       arrays2[0][2] = sum;//第一行第三个数:有效数的个数
       //3.为有效值赋横,纵,值
       int num=0;//赋值储存数据
       for (int i = 0; i < arrays.length; i++) {
           for (int j = 0; j < arrays[i].length; j++) {
               if(arrays[i][j]!=0){
                   num++;//代表有效值在稀疏数组中的行数
                   arrays2[num][0]=i;//横坐标
                   arrays2[num][1]=j;//纵坐标
                   arrays2[num][2]=arrays[i][j];//数的值
              }

          }

      }
       //打印输出稀疏数组
       System.out.println("行"+"\t"+
               "列"+"\t"+
               "数"+"\t");
       for (int i = 0; i < arrays2.length; i++) {
           /*为什么不用嵌套循环输出
           因为嵌套的数组长度就3,用0,1,2就可以表示
           如果再次嵌套会使计算量增大
           写代码要注重代码的高效简洁
            */
           System.out.println(arrays2[i][0]+"\t"+
                   arrays2[i][1]+"\t"+
                   arrays2[i][2]+"\t");
      }
       System.out.println("======================");
       //三,将稀疏数组还原为原来的数组
       //1.创建一个二维数组用于存放稀疏数组的数据
       //存放稀疏数组中所表示的行数arrays2[0][0]和列数arrays2[0][1]
       int[][] arrays3= new int[arrays2[0][0]][arrays2[0][1]];
       //2.将稀疏数组中的有效值存入
       for (int i = 1; i < arrays2.length; i++) {
           /*
           注意这里i=1必须从1开始不能从0开始
           否则会报Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
           越界错误
           原因:i=0从0开始为11行11列但是还原的数列虽然是11*11但是最大表示为10
               因为从0开始到10所以正好是11但是取不到11的值,所以会报错
            */

           arrays3[arrays2[i][0]][arrays2[i][1]]=arrays2[i][2];

      }
       //3.打印出原来的数组
       for (int i = 0; i < arrays3.length; i++) {
           for (int j = 0; j < arrays3[i].length; j++) {
               System.out.print(arrays3[i][j]+"\t");

          }
           System.out.println();

      }
       
  }
}

 

posted @ 2021-03-10 21:29  默默努力的路人甲  阅读(162)  评论(0)    收藏  举报