稀疏数组介绍
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以用稀疏数组来保存该数组。
- 稀疏数组的处理方式:
(1)记录数组有几行几列,多少个不同值。
(2)把具有不同值的元素和其行列及值记录在一个小规模的数组中,从而缩小程序的规模。 - 稀疏数组相当于记录有效值的坐标。
- 如下图,左边为原始数组,右边为稀疏数组。
实列
需求:编写五子棋游戏,有存盘和续上盘的功能
分析:二维数组记录棋盘时,很多值默认为0,会记录很多没有意义的数据,此时可用稀疏数组记录。
public static void main(String[] args) {
//需求:编写五子棋游戏,有存盘和续上盘的功能
//1.创建二维数组(棋盘) 11*11 0:没有棋子 1:黑棋 2:白棋
int[][] array1 = new int[11][11];
array1[1][2] = 1; //图中棋子位置
array1[2][3] = 2; //图中棋子位置
//输出原始的数组
System.out.println("输出原始的数组");
for (int[] ints : array1) { //array1.for
for (int anInt : ints) { //ints.for
System.out.print(anInt+"\t");
}
System.out.println(); //棋盘及棋子已打印出
}
System.out.println("==================");
//转换为稀疏数组和保存
//获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) { //行,列均遍历11次
if (array1[i][j]!=0){ //当棋盘中行列表示的数值不为0时,sum++计算出有效值个数
sum++;
}
}
}
System.out.println("有效的个数:"+sum); //输出有效值的个数
//2.创建一个稀疏数组的数组 (记录有效值的坐标,还原时直接根据坐标值还原)
int[][] array2 = new int[sum+1][3]; //稀疏数组的行值+1因为要显示行数,3列为(行,列,值)
array2[0][0] = 11; //[0][0]位置将行数显示为11行
array2[0][1] = 11; //[0][1]位置将列数显示为11列
array2[0][2] = sum; //[0][2]位置将有效值显示为sum个
//此时打印出稀疏数组的头部
//遍历二维数组,将非0的值存放到稀疏数组中
int count = 0; //统计非0值
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
count++; //当array1[][]中的元素不为0时,记录存放多少个数字
array2[count][0] = i; //从第几行的第一个位置存放横坐标
array2[count][1] = j; //从第几行的第二个位置存放纵坐标
array2[count][2] = array1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"
+array2[i][1]+"\t"
+array2[i][2]+"\t"); //将三列都遍历出
}
System.out.println("==================");
//还原稀疏数组
System.out.println("还原稀疏数组");
//1.读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]]; //array3[][]中行数为array[0][0]的数值
//array3[][]中列数为array[0][1]的数值
//2.给其中的元素还原他的值
for (int i = 1; i < array2.length; i++) { //遍历稀疏数组中的值 ,由于稀疏数组中第一行为头部,所以从第二行取值。
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//3.打印
//输出还原的数组
System.out.println("输出原始的数组");
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
运行结果如下:
代码可根据结果思考如何定义每个数组的。
学习内容来自:B站【狂神说Java】Java零基础学习视频通俗易懂