稀疏数组
- 第一行:记录原始数组一共有几行几列,几个不同的值
- 余下行:把具有不同值的元素的行列及值记录在一个数组中,从而缩小程序的规模
当一个二维数组的很多值是默认值0,则该数组就记录了很多没有意义的数据。这个时候就可以用稀疏数组了。
- 应用实例
- 分析思路
- 代码实现
public class SparseArray {
public static void main(String[] args) {
//1、11*11的原始棋盘,0为无效数据,1为黑子,2为蓝子
int[][] chessArr = new int[11][11];
//2、设置原始棋盘的有效棋子位置
chessArr[1][1] = 1; //第二列第二行有个黑子
chessArr[2][2] = 2; //第三列第三行有个蓝子
//3、获取有效数值个数
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j]!=0){
sum++;
}
}
}
//4、初始化稀疏数组【有效数组个数+1】【3】
//row col val
int[][] sparseArr = new int[sum+1][3];
//第一行:原始数组行数、原始数组列数、原始数组有效数值个数
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length; //都一样,取其一即可
sparseArr[0][2] = sum;
//5、将有效数值装入稀疏数组
int count = 0; //计数
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
//6、还原原始数组
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
}
}
-
效果展示
-
增加需求
-
代码实现
import java.io.*;
public class SparseArray {
public static void main(String[] args) throws Exception{
//1、11*11的原始棋盘,0为无效数据,1为黑子,2为蓝子
int[][] chessArr = new int[11][11];
//2、设置原始棋盘的有效棋子位置
chessArr[1][1] = 1; //第二列第二行有个黑子
chessArr[2][2] = 2; //第三列第三行有个蓝子
//3、获取有效数值个数
int sum = 0;
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j]!=0){
sum++;
}
}
}
//4、初始化稀疏数组【有效数组个数+1】【3】
//row col val
int[][] sparseArr = new int[sum+1][3];
//第一行:原始数组行数、原始数组列数、原始数组有效数值个数
sparseArr[0][0] = chessArr.length;
sparseArr[0][1] = chessArr[0].length; //都一样,取其一即可
sparseArr[0][2] = sum;
//5、将有效数值装入稀疏数组
int count = 0; //样式
for (int i = 0; i < chessArr.length; i++) {
for (int j = 0; j < chessArr[i].length; j++) {
if (chessArr[i][j]!=0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
//6、读取到磁盘中
//获取文件对象
File file = new File("E:\\map.data");
//文件写入流
FileWriter writer = new FileWriter(file);
//遍历数组,写入文件
for (int[] sparse:sparseArr) {
for (int s:sparse) {
writer.write(s+"\t");
}
writer.write("\n");
}
writer.close();
//7、还原原始数组
//从磁盘中读取数据
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = "";
int[][] chessArr2 = null;
int row = 0;
//循环读取文件的每一行数据
while ((line=reader.readLine())!=null){
//按tab位切割成字符串数组,再转为int数组
String[] temp = line.split("\t");
int[] ints = new int[temp.length];
for (int i = 0; i < ints.length; i++) {
ints[i] = Integer.parseInt(temp[i]);
}
row++;
//文件第一行,即稀疏数组的第一行数组,为原始数组的长宽数量
if (row==1){
chessArr2 = new int[ints[0]][ints[1]];
}else{
//余下添加即可,没有赋值的地方,数组会初始化为0
chessArr2[ints[0]][ints[1]] = ints[2];
}
}
reader.close();
}
}
- 效果展示