一、实际场景
为了模拟五子棋存档功能,将五子棋的分布模拟成二维数组,转化为稀疏数组,存入本地文件中。
二、稀疏数组
稀疏数组的第一行代表二维数组有几行几列一共有多少个非0(或其他数字)数字的数量,第二行之后代表了第一个数字在第几行第几列,值为多少。
通过观察发现:稀疏数组的列数为3列,行数是非0数字的数量+1。
三、代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) throws IOException {
// 先创建好一个二维数组,模拟棋盘分布
int arr1[][] = new int[11][11];
arr1[1][2] = 1;
arr1[2][3] = 2;
arr1[4][5] = 2;
System.out.println("原始的二维数组:");
printArr(arr1);
//接着开始准备创建稀疏数组
//1.首先遍历二维数组,获取非0数据的数量
int sum = 0;
for(int i = 0;i < 11; i++) {
for(int j = 0 ;j < 11;j++) {
if(arr1[i][j]!=0) {
sum++;
}
}
}
//2.创建稀疏数组
int xsarr[][] = new int[sum+1][3];
//这些代表二维数组是几行几列有多少数据
xsarr[0][0] = 11;
xsarr[0][1] = 11;
xsarr[0][2] = sum;
//对数据具体在几行几列进行赋值
int count = 0;
for(int i = 0;i < 11; i++) {
for(int j = 0 ;j < 11;j++) {
if(arr1[i][j]!=0) {
count++;
xsarr[count][0] = i;
xsarr[count][1] = j;
xsarr[count][2] = arr1[i][j];
}
}
}
//创建本地文件存储稀疏数组
File file = new File("D:\\map.data");
if(!file.exists()) {
file.createNewFile();
}
//创建文件输出流,并且覆盖写入
FileOutputStream fos = new FileOutputStream(file,false);
for(int[] row:xsarr) {
for(int data:row) {
// \t 为制表符, \r\n 为换行符
fos.write((data+"\t").getBytes());
}
fos.write("\r\n".getBytes());
}
fos.close();
//高效读取流
BufferedReader br = new BufferedReader(new FileReader(file));
int arr2[][] = null;
count=0;
String s = null ;
while((s=br.readLine())!=null) {
count++;
String[] d = s.split("\t");
//读取第一行时对二维数组空间赋予 之后具体对几行几列的值赋值
if(count==1) {
arr2 = new int[Integer.valueOf(d[0])][Integer.valueOf(d[1])];
}else {
arr2[Integer.valueOf(d[0])][Integer.valueOf(d[1])]=Integer.valueOf(d[2]);
}
}
br.close();
System.out.println("读取到的稀疏数组:");
printArr(arr2);
// //打印稀疏数组
// System.out.println("获取到的稀疏数组为:");
// printArr(xsarr);
// //3.将稀疏数组转换为新的二维数组
// int arr2[][] = new int[xsarr[0][0]][xsarr[0][1]];
// for(int x = 0;x<xsarr[0][2];x++) {
// arr2[xsarr[x+1][0]][xsarr[x+1][1]] = xsarr[x+1][2];
// }
// System.out.println("转化后的二维数组为:");
// printArr(arr2);
}
//打印二维数组的公共方法
public static void printArr(int arr[][]) {
for(int row[]:arr) {
for(int data : row) {
System.out.print(data+"\t");
}
System.out.println();
}
}
}