2、稀疏数组
2.1、基本介绍:
当一个数组大部分元素为0,或者为同一个值时,可以使用稀疏数组来保存该数组
实际需求
稀疏数组的处理方法是:
1、记录数组一共几行几列,有多少不同的值
2、把具有不同值得元素得 行 列 和 值 记录在一个小规模得数组中,从而缩小程序得规模
2.2、应用实例
1、使用稀疏数组,保留类似前面得二维数组(棋盘,地图等待)
2、把稀疏数组存盘,并且可以重新恢复原来得二维数组
3、整体思路分析
代码实现:
package com.aiguigu.sparsearray;
import java.io.*;
public class SparseArray {
public static void main(String[] args) throws Exception{
/*
0: 表示没有棋子
1:表示 黑子
2:表示 白子
*/
//1、创建一个原始的二维数组 11*11
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[5][6] = 2;
//输出原始的二维数组
System.out.println("原始的二维数组~~~");
for(int[] row : chessArr1){
for(int data : row){
System.out.printf("%d\t" ,data);
}
System.out.println();
}
//2、 将二维数组转成 稀疏数组
//2.1、先遍历二维数组 得到非0数据的个数
int sum = 0;
for (int i = 0; i < chessArr1.length; i++) {//得到行
for (int j = 0; j < chessArr1.length; j++) {//队列进行遍历
if (chessArr1[i][j] != 0){
sum += 1;
}
}
}
//2.2 创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//2.3 将二维数组的值赋给稀疏数组
//定义一个 count变量
int count = 0;
for (int i = 0; i <chessArr1.length ; i++) {
for (int j = 0; j <chessArr1.length ; j++) {
if (chessArr1[i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
}
}
}
//3、输出稀疏数组
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]);
}
//4、稀疏数组 ===>>> 二维数组
//4.1读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组
int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
//4.2读取 稀疏数组 后几行的数据并赋值给 二维数组
for (int i = 1; i <sparseArr.length; i++) {// i = 1 开始是因为 稀疏数组 从二行开始存放二维数组的数据
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//5、输出恢复后的二维数组
System.out.println("恢复后的二维数组");
for (int[] row : chessArr2) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();//输出一行数据后换行
}
//6、将稀疏数组保存在磁盘上
try {
System.out.println("将稀疏数组保存到磁盘并命名为map.data");
File file = new File("D:\\map.data");
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
System.out.println("写入中-----");
for (int i = 0; i <sparseArr.length ; i++) {
osw.write(sparseArr[i][0] + "," + sparseArr[i][1] + ","
+sparseArr[i][2] +",");
}
osw.close();//关闭输出流
fos.close();//关闭输出流
System.out.println("写入磁盘成功");
//读取磁盘中的map.data文件
System.out.println("读取中----");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
StringBuffer sb = new StringBuffer();
while (isr.ready()){
sb.append((char)isr.read());
}
isr.close();//关闭输出流
fis.close();//关闭输出流
System.out.println("读取成功");
String ss = sb.toString();
String[] sb1 = sb.toString().split(",");
System.out.printf("从磁盘读取的字符串为:\n%s\n",ss);//格式化输出
//恢复稀疏数组
int sum1 = 0;
int[][] sparseArr2 = new int[sb1.length/3][3];
sparseArr2[0][0] = Integer.parseInt(sb1[0]);
sparseArr2[0][1] = Integer.parseInt(sb1[1]);
sparseArr2[0][2] = Integer.parseInt(sb1[2]);
for (int i = 3; i < sb1.length ; i += 3) {
sum1++;
sparseArr2[sum1][0] = Integer.parseInt(sb1[i]);
sparseArr2[sum1][1] = Integer.parseInt(sb1[i+1]);
sparseArr2[sum1][2] = Integer.parseInt(sb1[i+2]);
}
System.out.println("还原后的稀疏数组为:");
for (int i = 0; i <sparseArr2.length ; i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArr2[i][0],sparseArr2[i][1],sparseArr2[i][2]);
}
//恢复二维数组
int[][] chessArr3 = new int[sparseArr2[0][0]][sparseArr2[0][1]];
for (int i = 1; i <sparseArr2.length ; i++) {
chessArr3[sparseArr2[i][0]][sparseArr2[i][1]] = sparseArr2[i][2];
}
System.out.println("还原后得二维数组为:");
for(int[] row : chessArr3){
for(int data : row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
运行结果:
原始的二维数组~~~
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
稀疏数组~~~~
11 11 3
1 2 1
2 3 2
5 6 2
恢复后的二维数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
将稀疏数组保存到磁盘并命名为map.data
写入中-----
写入磁盘成功
读取中----
读取成功
从磁盘读取的字符串为:
11,11,3,1,2,1,2,3,2,5,6,2,
还原后的稀疏数组为:
11 11 3
1 2 1
2 3 2
5 6 2
还原后得二维数组为:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0