java数据结构和算法
基本介绍:
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存数组
稀疏数组的处理方法:
记录数组一共有几行几列,有多少个不同的值
把具有不同的值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
例如:

解释: 第一行记录的是原始数组的行列和一共有多少个有效数字后面的行分别记录各个有效数据的位置和值
二维数组 转 稀疏数组的思路
1.遍历原始的二维数组,得到有效的数据的个数sum
2.根据sum就可以创建稀疏数组spareArr int[sum+1][3]
3.将二位数组的有效数据存到稀疏数组中
4.稀疏数组保存到磁盘,使用io流保存
稀疏数组转原始的二位数组的思路
(可以从文件中使用io流来读取稀疏数组)
1.先读取稀疏数组的第一行,根据第一行的数据创建原始的二位数据
2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
源代码:
public class SparseArray {
public static void main(String[] args) {
//创建一个原始的二维数组 11*11的
//0:表示没有棋子 1:表示黑子 2:表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
//输出原始的二维数组
System.out.println("原始二维数组");
for (int[] ints : chessArr1) {
for (int i : ints) {
System.out.printf("%d\t",i);
}
System.out.println();
}
//将二维数组 转 稀疏数组
//遍历二维数组,得到非零的值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j <11; j++) {
if (chessArr1[i][j] != 0){
sum++;
}
}
}
//创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二位数组,将非零的值存放到稀疏数组中
int count = 0 ;//用于记录第几个非零数据
for (int i = 0; i < 11; i++) {
for (int j = 0; j <11; j++) {
if (chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
//将稀疏数组保存到磁盘当中
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(new File("map.data"));
bw = new BufferedWriter(fw);
for (int i = 0; i < sparseArr.length; i++) {
String tmpStr = "";
for (int j = 0; j < sparseArr[i].length; j++) {
tmpStr += sparseArr[i][j] + " ";
}
tmpStr += "\r\n";
bw.write(tmpStr);
bw.flush();
}
}catch (Exception e){
e.printStackTrace();
}
//将稀疏数组读取出来
FileReader fr = null;
BufferedReader br = null;
int ch[][] = {};
try {
fr = new FileReader(new File("map.data"));
br = new BufferedReader(fr);
String lineStr="";
ArrayList<String> list = new ArrayList<>();
try {
while ((lineStr= br.readLine())!=null){
list.add(lineStr);
}
ch = new int[list.size()][list.get(0).length()];
for (int i = 0;i<list.size() ; i++) {
String[] c = list.get(i).split(" ");
for (int j = 0; j <c.length ; j++) {
ch[i][j]=Integer.parseInt(c[j]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}catch (Exception e){
e.printStackTrace();
}
//将稀疏数组恢复成二位数组
int chessArrs2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
// 赋值
for (int i = 1; i < sparseArr.length; i++) {
chessArrs2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//恢复后的二维数组
System.out.println("恢复后的二维数组:");
for (int[] ints : chessArrs2) {
for (int i : ints) {
System.out.printf("%d\t",i);
}
System.out.println();
}
}
}