稀疏数组

 

 

package 数组;

//稀疏数组:记录数组一共有几行几列,有多少个不同值
//把具有不同值的元素和行列及值记录在一个小规模数组中,从而缩小程序的规模
//稀疏数组的第一行记录行数、列数、有效值个数

public class Array06_XiShu {
public static void main(String[] args) {
//1、创建一个11*11的棋盘 0:无棋 1:黑棋 2:白棋
int[][] arr1 = new int[11][11];
arr1[1][2] = 1;
arr1[2][3] = 2;
//输出原始数组
System.out.println("输出原始数组");
for (int[] ints:arr1) {
for (int x:ints) {
System.out.print(x+"\t");
}
System.out.println();
}
//转为稀疏数组
//获取有效个数
int num = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(arr1[i][j] != 0)
num++;
}
}
System.out.println("=======================");
System.out.println("有效值个数为:"+num);

//2、创建稀疏数组
int[][] arr2 = new int[num+1][3]; //行数为有效值个数+1,列数固定为3
arr2[0][0] = 11; //二维数组的行数
arr2[0][1] = 11; //二维数组的列数
arr2[0][2] = num;//二维数组的有效值个数
//遍历二维数组,将非零的值存放到稀疏数组中
int count = 0; //记录非零值个数
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
if(arr1[i][j] != 0){
count++;
arr2[count][0] = i; //第一列存放横坐标
arr2[count][1] = j; //第二类存放纵坐标
arr2[count][2] = arr1[i][j]; //第三列存放非零值
}
}
}

//输出稀疏数组
System.out.println("稀疏数组");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i][0]+"\t"
+arr2[i][1]+"\t"
+arr2[i][2]+"\t");
}

//还原稀疏数组
//1、读取稀疏数组
int[][] arr3 = new int[arr2[0][0]][arr2[0][1]]; //00为行,01为列

//2、给其中的元素还原值
for (int i = 1; i < arr2.length; i++) { //从第1行开始还原,第0行存放的是行列数和有效值
arr3[arr2[i][0]][arr2[i][1]] = arr2[i][2];
}

//3、打印还原数组
System.out.println("===================");
System.out.println("输出还原的数组");
for (int[] arri:arr3) { //遍历arr3的每一行
for (int x:arri) { //遍历每一行的每一个元素
System.out.print(x+"\t");
}
System.out.println();
}
}
}
posted @ 2022-02-15 17:29  Neko-  阅读(31)  评论(0)    收藏  举报