1、稀疏数组的概念
在一个数组中,值为0的元素个数远远超过其他值的元素个数,我们将其他元素(除0之外的元素)用另外一个数组来保存,新形成的数组,我们称作稀疏数组。
2、稀疏数组的实现原理
3、稀疏数组预期效果
如下图所示,原始11行、11列的二维数组:
转换后的稀疏数组为:
4、代码实现
package Arrays;
/*
* 功能需求分析:
* 利用二维数组稀疏数组的知识,写一个模拟棋盘的项目
*
* 规定:
* 0:表示棋盘无棋子;
* 1:表示白棋;
* 2:表示黑棋。
*
* 数组arrays:保存原数组
* 数组arrays1:保存稀疏数组
* 数组arrays2:保存由稀疏数组恢复的数组
*
* */
public class ArraysProject {
public static void main(String[] args) {
int[][] arrays=new int[11][11];
arrays[1][2]=1;
arrays[2][3]=2;
//输出原始的数组
System.out.println("原始的数组为:");
for (int[] ints : arrays) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("===========================================");
//获取有效数字的个数
int sum=0;
for (int i=0;i<arrays.length;i++){
for(int j=0;j<arrays[i].length;j++){
if(arrays[i][j]!=0){
sum++;
}
}
}
System.out.println("有效数字的个数为:"+sum);
//创建一个稀疏数组
int arrays1[][]=new int[sum+1][3]; //稀疏数组有三列组成
arrays1[0][0]=11;
arrays1[0][1]=11;
arrays1[0][2]=sum;
//遍历原来的数组,将非零的元素保存到稀疏数组中去
int count=0; //用来保存第几个有效数字
for (int i = 0; i <arrays.length ; i++) {
for (int j = 0; j <arrays[i].length ; j++) {
if(arrays[i][j]!=0){
count++;
arrays1[count][0]=i; //有效元素所在行中第一列保存行坐标
arrays1[count][1]=j; //有效元素所在行中第二列保存列坐标
arrays1[count][2]=arrays[i][j]; //有效元素所在行中第三列保存有效元素
}
}
}
//输出稀疏数组元素
System.out.println("压缩后的稀疏数组如下:");
for (int i = 0; i <arrays1.length ; i++) {
for (int j = 0; j <arrays1[i].length ; j++) { //此处arrays[i].length值为3,稀疏数组有三列组成
System.out.print(arrays1[i][j]+"\t");
if(j/(arrays1.length-1)==1){
System.out.println();
}
}
}
//稀疏数组的恢复
System.out.println("=======================================");
System.out.println("稀疏数组的恢复:");
//1、读取稀数数组
int[][] arrays2=new int[arrays1[0][0]][arrays1[0][1]];
//2、由已知的数据,还原剩下的数据
//根据稀数数组中相应位置的值,将值加入还原后的数组中去,其余值为0
for (int i = 1; i <arrays1.length ; i++) { //i从1开始,因为第一行保存了数组的行数、列数及有效个数
// for (int j = 0; j <arrays2[i].length ; j++) {
// arrays2[arrays1[1][0]][arrays1[1][1]]=arrays1[1][2];
//arrays2[arrays1[2][0]][arrays1[2][1]]=arrays1[2][2];
arrays2[arrays1[i][0]][arrays1[i][1]]=arrays1[i][2];
// }
}
//遍历输出还原后的数组
System.out.println("还原后的数组:");
for (int i = 0; i < arrays2.length;i++) {
for (int j = 0; j <arrays2[i].length ; j++) {
System.out.print(arrays2[i][j]+"\t");
if(j/(arrays2.length-1)==1){
System.out.println();
}
}
}
}
}