稀疏数组
package reck;
public class Demo07 {
public static void main(String[] args) {
int[][] arrays=new int[11][11];
arrays[1][2]=1;
arrays[2][3]=2;
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
System.out.print(arrays[i][j]+"\t");
}
System.out.println();
}
//一,获取数组内有效值的个数
int sum=0;//创建一个值用于存放有效值的个数
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
/*写代码一定要严谨使用arrays.length也可以因为
是11*11的二维数组但是如果是11*10呢?
就会出现ArrayIndexOutOfBoundsException: 10越界错误
*/
if(arrays[i][j]!=0){
sum++;
}
}
}
System.out.println("数组内有效值的个数为:"+sum);
System.out.println("=========================");
//二,创建一个稀疏数组即一个二维数组
/*
sum+1为行因为第一行要表示:行数-列数-值的个数
即多占了一行所以要sum+1
3为列,第一行要表示:行数-列数-值的个数
第 n 行要表示:横坐标-纵坐标-值
*/
//1.创建一个稀疏数组
int[][] arrays2=new int[sum+1][3];
//2.给创建的稀疏数组赋第一行的值即:行数-列数-值的个数
arrays2[0][0] = arrays.length;//第一行第一个数:行值
arrays2[0][1] = arrays[0].length;//第一行第二个数:列值
//因为数组中每个数组长度都一样所以可以找[0]代替
arrays2[0][2] = sum;//第一行第三个数:有效数的个数
//3.为有效值赋横,纵,值
int num=0;//赋值储存数据
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
if(arrays[i][j]!=0){
num++;//代表有效值在稀疏数组中的行数
arrays2[num][0]=i;//横坐标
arrays2[num][1]=j;//纵坐标
arrays2[num][2]=arrays[i][j];//数的值
}
}
}
//打印输出稀疏数组
System.out.println("行"+"\t"+
"列"+"\t"+
"数"+"\t");
for (int i = 0; i < arrays2.length; i++) {
/*为什么不用嵌套循环输出
因为嵌套的数组长度就3,用0,1,2就可以表示
如果再次嵌套会使计算量增大
写代码要注重代码的高效简洁
*/
System.out.println(arrays2[i][0]+"\t"+
arrays2[i][1]+"\t"+
arrays2[i][2]+"\t");
}
System.out.println("======================");
//三,将稀疏数组还原为原来的数组
//1.创建一个二维数组用于存放稀疏数组的数据
//存放稀疏数组中所表示的行数arrays2[0][0]和列数arrays2[0][1]
int[][] arrays3= new int[arrays2[0][0]][arrays2[0][1]];
//2.将稀疏数组中的有效值存入
for (int i = 1; i < arrays2.length; i++) {
/*
注意这里i=1必须从1开始不能从0开始
否则会报Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
越界错误
原因:i=0从0开始为11行11列但是还原的数列虽然是11*11但是最大表示为10
因为从0开始到10所以正好是11但是取不到11的值,所以会报错
*/
arrays3[arrays2[i][0]][arrays2[i][1]]=arrays2[i][2];
}
//3.打印出原来的数组
for (int i = 0; i < arrays3.length; i++) {
for (int j = 0; j < arrays3[i].length; j++) {
System.out.print(arrays3[i][j]+"\t");
}
System.out.println();
}
}
}