二维数组之稀疏数组

复制代码
  1 package com.Lucky.base;
  2 
  3 import java.util.Arrays;
  4 
  5 /**
  6  * 稀疏数组:记录有效数据
  7  */
  8 public class sparseArray {
  9     public static void main(String[] args) {
 10         ///案例:11*11的棋盘  数据保存方法
 11 
 12         //1.普通的二维数组
 13         int[][] arr1=new int[11][11];
 14         //将数据放进数组中   0代表空白   1代表白棋子  2代表黑棋子
 15         //白棋数据
 16         arr1[5][6]=1;
 17         arr1[2][6]=1;
 18         arr1[5][9]=1;
 19         arr1[4][4]=1;
 20         //黑棋数据
 21         arr1[1][7]=2;
 22         arr1[2][2]=2;
 23         arr1[3][9]=2;
 24         arr1[7][7]=2;
 25 //效果图: 占据内存太大【要优化】
 26         /*
 27             0    0    0    0    0    0    0    0    0    0    0
 28             0    0    0    0    0    0    0    2    0    0    0
 29             0    0    2    0    0    0    1    0    0    0    0
 30             0    0    0    0    0    0    0    0    0    2    0
 31             0    0    0    0    1    0    0    0    0    0    0
 32             0    0    0    0    0    0    1    0    0    1    0
 33             0    0    0    0    0    0    0    0    0    0    0
 34             0    0    0    0    0    0    0    2    0    0    0
 35             0    0    0    0    0    0    0    0    0    0    0
 36             0    0    0    0    0    0    0    0    0    0    0
 37             0    0    0    0    0    0    0    0    0    0    0
 38          */
 39         //打印普通数组
 40         System.out.println("==============打印普通数组==============");
 41         printArr(arr1);
 42         System.out.println("==============打印稀释数组==============");
 43         printArrOut(sparseArr(arr1));
 44         System.out.println("==============转换稀释数组成普通数组==============");
 45         printArrOut(caseToArr(sparseArr(arr1)));
 46 
 47 
 48     }
 49 
 50 
 51 
 52     //2.将二维数组转换成稀疏数组
 53     //效果图:
 54         /*
 55              行    列    有效值
 56              11   11     8
 57         [0]   1    7     2
 58         [1]   2    2     2
 59         [2]   3    9     2
 60         [3]   7    7     2
 61         [4]   2    6     1
 62         [5]   4    4     1
 63         [6]   5    6     1
 64         [7]   5    9     1
 65 
 66          */
 67 
 68 
 69     /**
 70      * 思路:1.获取原来二位数组的行和列
 71      *      2.获取有效值个数[黑白棋的总和]
 72      *      3.创建新的二维数组  行的长度row=有效值+1
 73      *                       列的长度col=3
 74      *      4.在第一行开始填充数据头部
 75      *      5.在第二行开始填充数据
 76      */
 77 
 78      public static int[][] sparseArr(int[][] args){
 79         // 1.获取原来二位数组的行和列
 80          int row=args.length;
 81          int col=args[0].length;
 82 
 83         // 2.获取有效值个数[黑白棋的总和]
 84          int sum=0;    //黑白棋的总和
 85          for (int i = 0; i < args.length; i++) {
 86              for (int j = 0; j < args.length; j++) {
 87                     //进入二维数组内部
 88                  if(args[i][j]!=0){
 89                      sum++;    //如果是有效值,sum数量递增
 90                  }
 91              }
 92          }
 93 
 94          //3.创建新的二维数组  行的长度row=有效值+1
 95           //                列的长度col=3
 96          int[][] newArr=new int[sum+1][3];
 97 
 98         // 4.在第一行开始填充数据头部
 99          newArr[0][0]=row;
100          newArr[0][1]=col;
101          newArr[0][2]=sum;
102 
103         // 5.在第二行开始填充数据
104          int index=1;   //定义要填充数据的行数【第二行开始】
105          for (int i = 0; i < args.length; i++) {
106              for (int j = 0; j < args.length; j++) {
107                if(args[i][j]!=0){
108                    newArr[index][0]=i;
109                    newArr[index][1]=j;
110                    newArr[index][2]=args[i][j];
111 
112                    index++;
113                }
114              }
115          }
116          return newArr;
117      }
118 
119     /**
120      * 将稀疏数组转换成普通数组
121      * @param args
122      * @return
123      */
124     public static int[][] caseToArr(int[][] args){
125         // 1.获取原来稀疏数组的行和列
126             int[] frist=args[0];   //获取稀疏数组中的第一行【第一行存在原来数组的行数和列数以及有效个数】
127 
128         int row=frist[0];        //稀疏数组中的[0][0]是原来数组的行数
129         int col=frist[1];        //稀疏数组中的[0][1]是原来数组的列数
130 
131         //创建新数组
132         int[][] newVar=new int[row][col];
133         for (int i = 1; i < args.length; i++) { //args.length=frist[2]+1
134             int[] sparseRow = args[i];
135             ///  sparseRow:稀疏数组的行的所有数据: 例如:[1,7,2]
136             //sparseRow[0]=  1
137             //sparseRow[1]=  7
138             //sparseRow[2]=  2
139             newVar[sparseRow[0]][sparseRow[1]] = sparseRow[2];  //在指定位置进行赋值操作
140 
141             //也可以这样:
142             // newVar[args[i][0]][args[i][1]] = args[i][2];
143         }
144         return newVar;
145     }
146 
147     //将稀疏数组转换成二维数组
148 
149 
150     /**
151      * 打印二维数祖方法:
152      * @param sd
153      */
154     public static void printArr(int[][] sd){
155 
156         for (int i = 0; i < sd.length; i++) {
157             for (int j = 0; j < sd.length; j++) {
158                 System.out.print(sd[i][j]+"\t");
159 
160             }
161             System.out.println();
162 
163         }
164     }
165 
166 
167     /**
168      * 打印稀释数组方法
169      */
170     public static void printArrOut(int[][] sd){
171 
172         for (int i = 0; i < sd.length; i++) {
173             for (int j = 0; j < sd[0].length; j++) {
174                 System.out.print(sd[i][j]+"\t");
175 
176             }
177             System.out.println();
178 
179         }
180     }
181 }
复制代码

 

posted @   唯易人生  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示