二维数组转换为稀疏数组
/**
* 二维数组转换稀疏数组的思路:
* 1.遍历原始的二维数组,得到有效数据的个数sum(sum有多少个,稀疏数组就有sum+1行)
* 2.根据sum的个数创建稀疏数组sparseArray int[sum + 1][3](列为固定值,行不确定)
* 3.将二维数组的有效数据放入稀疏数组中
* 0 0 0 1 0
* 2 0 0 0 3
* 0 5 0 0 0
* 0 0 6 0 0
* */
//创建一个原始的4行5列二维数组
int[][] chessArray = new int[4][5];
chessArray[0][3] = 1;
chessArray[1][0] = 2;
//chessArray[1][4] = 3;最后结果只有效值有5个,但是结果只输出四个这个3无法输出
chessArray[2][1] = 5;
chessArray[3][2] = 6;
//遍历原始的二维数组,并记录值有几个
for(int[] row : chessArray){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//计算有效值有几个
//如果sum = 0 则会从0开始算结果为4,但是个数却还是有5个,所以这里就从1开始计数
int sum = 0;
for(int i = 0; i < chessArray.length; i++){
for (int j = 0; j < chessArray.length; j++){
if(chessArray[i][j] != 0){
sum++;
}
}
}
System.out.println("有效值的个数为:" + sum);
//将有效值放入稀疏数组中
//创建稀疏数组
int[][] sparseArray = new int[sum][3];
/**
* 向稀疏数组中添加固定数据(数组从0开始计算)
* @auther [0][0] = 4 表示稀疏数组第一列为行数,行数为4
* @auther [0][1] = 5 表示稀疏数组第二列为列数,列数为5
* @auther [0][2] = sum 表示稀疏数组第三列为value,值为sum
* */
sparseArray[0][0] = 4;
sparseArray[0][1] = 5;
sparseArray[0][2] = sum;
/**
* @auther index 数组下标
* */
int index = 0;
for(int i = 0; i < chessArray.length; i++){
for(int j = 0; j < chessArray.length; j++){
if(chessArray[i][j] != 0){
index++;
sparseArray[index][0] = i;
sparseArray[index][1] = j;
sparseArray[index][2] = chessArray[i][j];
}
}
}
//输出稀疏数组
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]);
}
)
最后结果
这里存在一个问题,,把初始数组定义为一个一般数组时“2 0 0 0 0 3” 这一行中最后这3始终无法识别,有效值依然为5,但是稀疏数组中这3确实是没有,整体思路很清楚唯一就是这个小点无法解决,看了很多篇代码大家的都是差不多,通过修改代码重新测试后才发现稀疏数组只能将初始的二维数组定义为矩阵!!!
所以修改后的代码如下:
/**
* 二维数组转换稀疏数组的思路:
* 1.遍历原始的二维数组,得到有效数据的个数sum(sum有多少个,稀疏数组就有sum+1行)
* 2.根据sum的个数创建稀疏数组sparseArray int[sum + 1][3](列为固定值,行不确定)
* 3.将二维数组的有效数据放入稀疏数组中
* 0 0 0 1
* 2 0 0 3
* 0 5 0 0
* 0 0 6 0
* */
//创建一个原始的4行4列二维数组
int[][] chessArray = new int[4][4];
chessArray[0][3] = 1;
chessArray[1][0] = 2;
chessArray[1][3] = 3;
chessArray[2][1] = 5;
chessArray[3][2] = 6;
//遍历原始的二维数组,并记录值有几个
for(int[] row : chessArray){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
System.out.println();
int sum = 0;
for(int i = 0; i < chessArray.length; i++){
for (int j = 0; j < chessArray.length; j++){
if(chessArray[i][j] != 0){
sum++;
}
}
}
System.out.println("有效值的个数为:" + sum);
//将有效值放入稀疏数组中
//创建稀疏数组
int[][] sparseArray = new int[sum + 1][3];
/**
* 向稀疏数组中添加固定数据(数组从0开始计算)
* @auther [0][0] = 4 表示稀疏数组第一列为行数,行数为4
* @auther [0][1] = 4 表示稀疏数组第二列为列数,列数为4
* @auther [0][2] = sum 表示稀疏数组第三列为value,值为sum
* */
sparseArray[0][0] = 4;
sparseArray[0][1] = 4;
sparseArray[0][2] = sum;
/**
* @auther index 数组下标
* */
int index = 0;
for(int i = 0; i < chessArray.length; i++){
for(int j = 0; j < chessArray.length; j++){
if(chessArray[i][j] != 0){
index++;
sparseArray[index][0] = i;
sparseArray[index][1] = j;
sparseArray[index][2] = chessArray[i][j];
}
}
}
//输出稀疏数组
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]);
}