基本介绍:
当一个数组中的大部分数值为0,或者为同一个数值时,可以使用稀疏数组来保存该数组
处理方法:
1.记录原来的数组有几行几列,有多少个不同的数值,存放在稀疏数组的第一行
2.把不同数值的行,列以及数值记录在一个小规模的数组中,从而缩小程序的规模
二维数组转稀疏数组:
1.遍历二维数组,得到有效值个数 n;
2.创建稀疏数组,spare[n+1][3];
3.遍历二维数组,将有效值赋给稀疏数组
稀疏数组转二维数组
1.读取稀疏数组第一行,获取二维数组的行和列
2.读取稀疏数组的后几行,赋给原数组
代码实现:
public class SpareArray {
public static void main(String[] args) {
//创建原始数组,初始化数据
int spareArr1[][] = new int[11][11];
spareArr1[1][2] = 1;
spareArr1[2][3] = 2;
spareArr1[4][1] = 1;
//输出原始数组
System.out.println("原始数组为~~~");
System.out.println();
for(int[] row:spareArr1){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转化为稀疏数组
//1.遍历数组,获得有效值个数
int sum = 0;//记录非0数值的个数
for (int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(spareArr1[i][j]!=0){
sum++;
}
}
}
//2.创建稀疏数组
int spare[][] = new int[sum+1][3];
//3.给稀疏数组第一行赋值
spare[0][0] = 11;
spare[0][1] = 11;
spare[0][2] = sum;
//4.遍历二维数组,将非0的数赋给稀疏数组
int count = 0; //用来记录是第几个非0数
for (int i=0;i<11;i++){
for(int j=0;j<11;j++){
if(spareArr1[i][j]!=0) {
count++;
spare[count][0] = i;
spare[count][1] = j;
spare[count][2] = spareArr1[i][j];
}
}
}
//输出稀疏数组
System.out.println();
System.out.println("输出稀疏数组:");
for(int i = 0;i<spare.length;i++){
System.out.printf("%d\t%d\t%d\t\n",spare[i][0],spare[i][1],spare[i][2]);
}
//将稀疏数组转化为二维数组
//1.读取稀疏数组的第一行,获取原数组的行和列
int chessArr[][] = new int[spare[0][0]][spare[0][1]];
//2.获取后几行的数据,赋值给新数组
for(int i =1;i<spare.length;i++){
chessArr[spare[i][0]][spare[i][1]] = spare[i][2];
}
System.out.println("转换完成的二维数组为~~~");
System.out.println();
for(int[] row:chessArr){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}