1.稀疏数组的基本介绍
当一个数组中大部分值为0或者相同时,我们的数组相当于存储了很多意义不大的值,造成了空间上的浪费,所以我们就可以利用稀疏数组来存储这些值。
如何用稀疏数组来处理这样的上面这样类型的数组呢?
(1)记录原数组一共几行几列,一共有多少不同的值。
(2)把这些值不相同的元素所在的行、列以及其本身的值记录在一个小规模数组当中。(这个小规模数组就是稀疏数组)
Eg:6行7列的二维数组——>9行3列的稀疏数组 如下图所示:
# 稀疏数组的首行记录:原始数组的行和列以及多少非零不同值的个数;
# 其他行记录:具体非零值的 :行+列+值
稀疏数组的行数=原二维数组有效元素的个数+1;
稀疏数组的列数=3;
2.稀疏数组的转换
2.1.二维数组——>稀疏数组
1) 先遍历原始二维数组得到有效数据的个数:sum
2) 根据sum就可以创建系数数组 sparseArray :int [sum+1][3];行数=sum+1;列数=3
3) 将二维数组的有效数据存入到稀疏数组中即可
//一、创建原始二维数组
public static void main(String[] args) {
//创建11行11列的五子棋盘 0:无棋子 1:黑棋 2:白棋
int [][] chessArray=new int[11][11];
chessArray[1][2]=1;
chessArray[2][3]=2;
chessArray[4][5]=1;
//做一个输出 加强for循环 一维数组一个加强for 二维数组两个嵌套
for (int[] resultArray:chessArray){
//这个for打印出来一个一维数组也就是一行
for (int result:resultArray){
System.out.print("\t"+result);
}
//让没打出一个数组 就换一行
System.out.println();
}
}
//二、将二维数组转换为稀疏数组
//1.先找出有效元素个数
int sum=0;
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
if (chessArray[i][j]!=0){
sum++;
}
}
}
System.out.println("sum="+sum);
//2.创建对应的稀疏数组
int [][] sparseArray=new int[sum+1][3];
//给稀疏数组赋值
//首行赋值
sparseArray[0][0]=11;//第一行第一列 行数=11;
sparseArray[0][1]=11;//第一行第二列 列数=11;
sparseArray[0][2]=sum;//第一行第三列 有效数据为sum个;
//给剩下的行赋值 遍历二维数组 把非零的值存入稀疏数组
int current=0;//作为一个计数器 来表示是第几个非零数据 也就是稀疏数组的行数
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
if (chessArray[i][j]!=0){
//而稀疏数组的行数是要递增的 每循环一次找到不是0的值 就要递增一次
current++;
sparseArray[current][0]=i; //本行的第一列就是原始数组的行
sparseArray[current][1]=j;//本行的第二列就是原始数组的列
sparseArray[current][2]=chessArray[i][j];//本行的第三列就是原始数组的该位置的值
}
}
}
//输出稀疏数组
System.out.println("这是稀疏数组");
//sparseArray.length 二维数组行的长度
//sparseArray[i].length 二维数组列的长度
for (int i=0;i<sparseArray.length;i++){
System.out.println("\t"+sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);
}
2.1稀疏数组——>二维数组
1) 根据稀疏数组的首行存储的元素确定原始二维数组的行数、列数、和非零有效数值的个数如上图所示:
int [ sparse[0][0] ] [ sparse[0][1] ]
稀疏数组的sparse[0][0]—>二维数组的行数
稀疏数组的sparse[0][1]—>二维数组的列数
2) 再读取稀疏数组剩余几行的数据赋值给二维数组
public static void main(String[] args) {
//一、将稀疏数组转换为二维数组
//先创建一个稀疏数组
int[][] sparseArray=new int[][]{{6,7,8},{0,3,22},{0,6,15},{1,1,11},
{1,5,17},{2,3,-6},{3,5,39},{4,0,91},{5,2,28}};
System.out.println("这是稀疏数组");
for (int i=0;i<sparseArray.length;i++){
System.out.println("\t"+sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);
}
//1.把稀疏数组的首行赋给二维数组
int[][] chessArray=new int[sparseArray[0][0]][sparseArray[0][1]];
//2.读取稀疏数组后面几行(从第二行开始)的数据 赋值给二维数组
//二维数组已经被动态初始化 而int类型的默认值为0 所以不用考虑0的存放
for (int i=1;i<sparseArray.length;i++){
//稀疏数组本行的第1列是二维数组的行
//稀疏数组本行的第2列是二维数组的列
//稀疏数组本行的第3列是二维数组在该位置的值
chessArray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
System.out.println("这是转换后的二维数组");
//打印二维数组
for (int[] resultArray:chessArray){
//这个for打印出来一个一维数组也就是一行
for (int result:resultArray){
System.out.print("\t"+result);
}
//让没打出一个数组 就换一行
System.out.println();
}
}