学习笔记
二维数组简介
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。
二维数组
二维数组类似于五子棋的棋盘
引入稀疏数组
假如我们有二维数组,需要保存,发现上面的数据有很多数据是无效的数据,有效数据只有2个
这样保存下来会有很多的无效数据,假如无效数据过于庞大,会大大的影响网络传输效率等,所以就可以通过稀疏数组来让无效的数据消失.
代码解析(详细解释在代码注释中,二维数组转稀疏数组转二维数组)
package com.fs.demo01;
/*
稀疏数组
将原本二维数组多余的数据去除,保留原本的有效数据,降低数据的大小,提升效率
*/
public class SparseArray {
public static void main(String[] args) {
//创建二维数组,来表示棋盘
//0表示棋盘的点,1表示黑子,2表示蓝子
int doubleArray[][] = new int[11][11];
//给第2排的第3列放上一个黑子(行列从索引0开始)
doubleArray[1][2] = 1;
//给第三排的第4列放上一个蓝子
doubleArray[2][3] = 2;
//输出一下二维数组
//循环遍历两次,因为二维数组是两个一维数组合成
System.out.println("原始二维数组棋盘----------------------------");
for (int[] ints : doubleArray) {
for (int anInt : ints) {
//排版一下
System.out.printf("\t"+anInt);
}
//换行
System.out.println();
}
System.out.println("将二维数组转成稀疏数组------------------------");
//先遍历二维数组中数据非0 的个数
//定义一个变量保存非0的个数
int sum = 0;
for (int i = 0; i < doubleArray.length; i++) {
int[] ints = doubleArray[i];
for (int j = 0; j < ints.length; j++) {
int anInt = ints[j];
if (anInt!=0){
sum++;
}
}
}
System.out.println("二维数组中已经存放的棋子个数为:"+sum);
/**
* 对应我们上面的二维数组
* 稀疏数组格式
* 对应二维数组的行 对应二维数组的列 对应的值
* 第一行是二维数组的格式 11(二维数组行) 11(二维数组列) 2(有效值)
* 后面的就是对应二维数组的 1 2 1
* 实际坐标 2 3 2
*
*
* 打印结果:
* 11 11 2
* 1 2 1
* 2 3 2
*/
//创建稀疏数组 行为sum+1,因为有一个二维数据数据行 列永远是三
int sparseArray[][] = new int[sum+1][3];
//给稀疏数组的行列复制
sparseArray[0][0] = doubleArray.length;//第一行第一列
sparseArray[0][1] = doubleArray.length;//第一行第二列
sparseArray[0][2] = sum;//第一行第三列
//遍历二维数组,当二维数组有值得时候记录坐标,将值赋值给稀疏数组
//定义一个变量来存储当前是洗漱数组的第几行
int row = 1;//稀疏数组从第二行开始,因为第1行存放了二维数组的数据
for (int i = 0; i < doubleArray.length; i++) {
int[] ints = doubleArray[i];
for (int j = 0; j < ints.length; j++) {
int anInt = ints[j];
if (anInt!=0){
sparseArray[row][0] = i;//row行的第1列存档有数据的行
sparseArray[row][1] = j;//row行的第二列存放二维数组有数据的列
sparseArray[row][2] = doubleArray[i][j];//row行的第三列存放有数据的二维数组本身的值
row++;//存放完加一行
}
}
}
//循环遍历打印一下稀疏数组
for (int[] ints : sparseArray) {
for (int anInt : ints) {
//排版一下
System.out.printf("\t"+anInt);
}
//换行
System.out.println();
}
System.out.println("将稀疏数组恢复成二维数组-----------------------");
/**
* 在将稀疏数组恢复成二维数组
* 1.先读取稀疏数组的第一行数据,根据第一行数据恢复原来的二维数组平面
* 2.然后读取稀疏数组的第二行后的数据,第二行的第一列就是有效值在二维数组的行,第二行的第二列就是有效值在二维数组的列,第二行的第三列就是有效值
*
*/
//创建恢复的二维数组.sparseArray[0][1]==11 sparseArray[0][2]==11
int doubleArrayNew[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//循环稀疏数组,从第二行开始,将行列赋值在新的二维数组中
for (int i = 1; i < sparseArray.length; i++) {
/*
对应稀疏数组的形态来看
11 11 2
1 2 1
2 3 2
循环第一次的时候
sparseArray[i][0] = 1 sparseArray[i][1]=2 sparseArray[i][2]=1
循环第二次的时候
sparseArray[i][0] = 2 sparseArray[i][1]=3 sparseArray[i][2]=2
*/
doubleArrayNew[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//打印一下新的二维数组,看打印结果是否和原来的一样
for (int[] ints : doubleArrayNew) {
for (int anInt : ints) {
//排版一下
System.out.printf("\t"+anInt);
}
//换行
System.out.println();
}
}
}