稀疏数组
1.先看实际需求
编写的五子棋程序中,在存盘退出和续上盘的功能
分析问题:
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,那么该怎么解决呢?稀疏数组。
2.基本介绍
当一个数组中大多数元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法:
- 记录数组一共有几行几列,有多少个不同的值。
- 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
3.应用实例
1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
2)把稀疏数组存盘,并且可以从新恢复原来的二维数组
代码实现
package com.yt;
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组 11*11
//0:表示没有棋子,1表示黑子,2表示篮子
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
chessArr[4][5] = 2;
//输出原始的二维数组
System.out.println("原始的二维数组:");
for (int[] arr : chessArr){
for (int data : arr){
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组转化为稀疏数组
//1.先遍历二维数组 得到非0的元素个数
int sum = 0;
for (int i=0; i<chessArr.length;i++){
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0){
sum++;
}
}
}
//2.创建对应的稀疏数组
int[][] sparseArr = new int[sum+1][3];//行数是非0元素个数加1,列数就是3,这个是不变的
//给稀疏数组的第一行赋值
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr.length;
sparseArr[0][2] = sum;//存放非0元素的个数
//3.遍历原始的二维数组,将非0元素存入稀疏数组中
int count = 0;//表示将非0元素存到第几行
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr.length; j++) {
if (chessArr[i][j] != 0){
count++;
sparseArr[count][0] = i;//记录下非0元素在原始数组中的行标
sparseArr[count][1] = j;//记录下非0元素在原始数组中的列标
sparseArr[count][2] = chessArr[i][j];//记录下非0元素
}
}
}
//4.输出稀疏数组
System.out.println();
System.out.println("得到的稀疏数组");
for (int i=0; i<sparseArr.length; i++){
for (int j = 0; j < sparseArr[i].length; j++) {
System.out.printf("%d\t" , sparseArr[i][j]);
}
System.out.println();
}
//另外的知识点:将稀疏数组转化为原始的数组
//1.先从稀疏数组的第一行得到原始的数组的大小
int row = sparseArr[0][0];
int column = sparseArr[0][1];
//2.创建原始数组的大小
int[][] origArr = new int[row][column];
//3.遍历稀疏数组,将对应的位置填入对应的非0元素
for (int i = 1; i < sparseArr.length; i++) {
origArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//3.输出恢复之后的原始数组
System.out.println();
System.out.println("恢复之后的数组");
for (int[] row1 : origArr){
for (int data : row1){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}