在学习了b站狂神讲java的稀疏数组后,完成了一下这个稀疏数组的打印和还原,希望能够和大家交流学习。
package array;
public class XiShuArray {
// 稀疏数组案例
public static void main(String[] args) {
/* 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 */
// 创建一个11*11的棋盘
int[][] array1 = new int[11][11];
// 赋值表示说下的棋的位置
array1[1][2] = 1;
array1[2][3] = 2;
// 打印棋盘内容
System.out.println("原数组为:");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("===================================================================");
// 稀疏数组创建开始
// 首先遍历数组取得有多少非0数(取得有效数个数)
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
count++;
}
}
}
// 创建稀疏数组
int[][] array2 = new int[count+1][3];
// 稀疏数组第一行内容为:
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = count;
// 遍历原数组来取得有效数的坐标并赋值
int index = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
index++;
array2[index][0] = i;
array2[index][1] = j;
array2[index][2] = array1[i][j];
}
}
}
// 打印稀疏数组
System.out.println("稀疏数组为:");
for (int i = 0; i < array2.length; i++) {
for (int j = 0; j < array2[i].length; j++) {
System.out.print(array2[i][j]+"\t");
}
System.out.println();
}
System.out.println("===================================================================");
// 根据稀疏数组还原原来的数组
// 创建一个新数组来装数据,array2[0][0]和array2[0][1]分别装的是棋盘的行数和列数,也就是数组的大小
int[][] array3 = new int[array2[0][0]][array2[0][1]];
// 根据稀疏数组向新数组内填充数据
// i 从1开始,因为稀疏数组第一行是棋盘基础信息
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
// 打印棋盘内容
System.out.println("还原后的数组为:");
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}