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 }