package com.asia.algorithm;
/**
* @author asia
* @Title:
* @Package
* @Description: 稀疏数组
* @date 2019/8/2814:32
*/
public class SparseArray {
public static void main(String[] args) {
//创建一个11*11的棋盘
int[][] checkerboard=new int[11][11];
//设置棋子,0表示没有棋子 1,表示黑子 ,2 表示蓝子,创建棋子
checkerboard[1][2]=1;
checkerboard[2][3]=2;
//输出原始数组
for (int[] row:checkerboard) {
for (int data: row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//遍历收集原始数组中的非零数据
int count=0;
for (int i = 0; i < checkerboard.length; i++) {
for (int j = 0; j < checkerboard[0].length; j++) {
if (checkerboard[i][j]!=0){
count++;
}
}
}
//创建稀疏数组
int[][] SparseArray=new int[count+1][3];
//给稀疏数组赋值
SparseArray[0][0]=checkerboard.length; //行
SparseArray[0][1]=checkerboard[0].length; //列
SparseArray[0][2]=count;
//遍历原始二维数组,给稀疏数组赋值
int sum=0;
for (int i = 0; i < checkerboard.length; i++) {
for (int j = 0; j < checkerboard[0].length; j++) {
//i 是 行 ,j是列
if (checkerboard[i][j]!=0){
sum++; //记录每个数的所在行
//如果有棋子的行数就加一 列是永远不变的
SparseArray[sum][0]=i;//为第sum行的第一列赋值
SparseArray[sum][1]=j;//为第sum行的第二列赋值
SparseArray[sum][2]=checkerboard[i][j];//为第sum行的第三列赋值
}
}
}
//输出稀疏数组
System.out.println("稀疏数组");
System.out.printf("%s\t%s\t%s\t\n","行","列","值");
for (int i = 0; i < SparseArray.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",SparseArray[i][0],SparseArray[i][1],SparseArray[i][2]);
}
System.out.println();
//将二维数组转换为原始的二维数组
//创建二维数组
int array[][]=new int[SparseArray[0][0]][SparseArray[0][1]];//SparseArray[0][1]=11
//将稀疏数组为二位数组赋值
for (int i = 1; i < SparseArray.length; i++) {//i表示行 ,因为第一行是创表数据,所以省略
int row=SparseArray[i][0];
int column=SparseArray[i][1];
array[row][column]=SparseArray[i][2];
}
//输出恢复后的数组
System.out.println("恢复后的数组");
for (int[] row:array) {
for (int data:row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}
输出图