package com.atguigu.sparsearray;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName SparseArray
* @Description TODO
* @Author Stitches
* @Date 2022.5.18 21:48
* @Version 1.0
*/
public class SparseArray {
public static void main(String[] args) throws IOException {
//创建一个原始的二维数组 11 * 11
//0: 表示没有棋子,1:表示黑子 2:表示蓝子
int chessArr1[][] = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[4][5] = 2;
//输出原始的二维数组
System.out.println("原始的二维数组:");
for(int[] row : chessArr1) {
for(int data: row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//将二维数组 转 稀疏数组的意思
//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++;
}
}
}
System.out.println("sum = " + sum);
//2.创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍历二维数组,将非0的值存放到sparseArr中
int count = 0; //用于记录是第几个非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];
}
}
}
System.out.println();
System.out.println("得到的稀疏数组为:");
/*for(int[] row : sparseArr) {
for(int data : row) {
System.out.printf("%d\t",data);
}
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]);
}
System.out.println();
//调用写入磁盘方法
saveSparseArray(sparseArr);
System.out.println("================================");
//调用读取方法,测试是否写入成功
int[][] spArrs = readSparseArr("D:\\sparseArr.txt");
for(int[] row : spArrs ) {
for(int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
//将稀疏数组 --》恢复成原始的二维数组
/*
1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int[11][11]
2.在读取稀疏数组后几行的数据,并赋给 原始的二维数组即可。
*/
//1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//2.在读取稀疏数组后几行的数据,并赋给 原始的二维数组即可。
for(int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//输出恢复后的二维数组
System.out.println();
System.out.println("恢复后的二维数组:");
for(int[] row : chessArr2) {
for(int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
}
//创建将稀疏数组写入磁盘文件的方法
public static void saveSparseArray(int[][] sparseArr) throws IOException {
//1.创建抽象路径名
File file = new File("D:\\sparseArr.txt");
//2.判断是否存在,否的话,创建由该抽象路径名命名的新文件
if(!file.exists()) {
file.createNewFile();
}
//3.创建字符输出流对象
FileWriter fw = new FileWriter(file);
for(int i = 0; i < sparseArr.length; i++) {
//先是写入前n-1列的值,并在尾部加上制表符“\t”
for(int j = 0; j < sparseArr[0].length - 1; j++) {
fw.write(sparseArr[i][j] + "\t");
}
//将最后一列写入,后边不加“\t”
fw.write(sparseArr[i][sparseArr[0].length -1] + "");
fw.write("\n");
}
fw.flush();
fw.close();
}
public static int[][] readSparseArr(String fileName) throws IOException {
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader(fileName));
//定义一个集合用来存放读取的数据
List<String> list = new ArrayList<>();
//一行一行的读取
String lineStr;
while((lineStr = br.readLine()) != null) {
list.add(lineStr);
}
//获取行数
int row = list.size();
//创建接收稀疏数组
int[][] sparseArray = new int[row][3];
//记录当前行
int count = 0;
//遍历并依次写入稀疏数组中
for(String str : list) {
//通过"\t"进行分割
String[] strs = str.split("\t");
//稀疏数组固定的为3列,故依次将一行中的数据放入
sparseArray[count][0] = Integer.valueOf(strs[0]);
sparseArray[count][1] = Integer.valueOf(strs[1]);
sparseArray[count][2] = Integer.valueOf(strs[2]);
//行数加1
count++;
}
br.close();//关闭字符缓冲输入流
return sparseArray;//返回稀疏数组
}
}
06-28
225