涉及知识点
二维数组转稀疏数组
稀疏数组转二维数组
java把数组写入txt,再把txt中的数据读取出来
稀疏数组的应用场景
编写的五子棋程序中,有存盘退出和续上盘的功能。
因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
疏数组的处理方法是:
记录数组一共有几行几列,有多少个不同的值
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
比如上面这个67的数组,可以用93的数组代替,第一行分别是原来矩阵的行、列、不同的值的个数
以后每行分别记录每一个非零值在原来数组中所处的行、列以及该数的数值。数组元素从42变到27,起到了降低原始数组规模的作用
二维数组转稀疏数组转换的思路分析
1.遍历原始的二维数组,得到有效数据的个数sum
2.根据sum就可以创建稀疏数组sparseArr int[sum+ 1] [3]
3.将二维数组的有效数据数据存入到稀疏数组
稀疏数组转原始的二维数组的思路
1.先读取稀疏数组的第-行, 根据第- -行 的数据,创建原始的1 = E维数组,比如上面的chessArr2= int [1][1]
2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可.
代码实现
package SparseArray;
import java.io.*;
/*
实现定义一个二维数组,转成稀疏数组,再把稀疏数组转成二维数组,要实现存到磁盘再读取出来
*/
public class SparseArray {
public static void main(String[] args) throws IOException {
System.out.println("*********原二维数组************");
//先定义二维数组
int [][]arryOringal=new int[11][11];
//给二维数组赋值
for(int i=0;i<arryOringal.length;i++)
{
arryOringal[i][i]=i;
}
String filePath="./spaseArray.txt";//文件在工程目录下,如果没有程序会创建文件
//定义写入txt的io对象
File file=new File(filePath);//存放数组数据的文件
FileWriter out = new FileWriter(file); //文件写入流
//遍历输出二维数组
for(int []row: arryOringal)//增强for循环,得到的是一个一维数组(一行)
{
for(int val:row)//遍历得到的一维数组
{
System.out.print(val+"\t");
String content=val+"\t";
}
System.out.println("\n");//输出一行换行
}
/*二维数组转稀疏数组*/
//获取原二维数组非0数
int size=0;
for(int i=0;i<arryOringal.length;i++)//二维数组的行
{
for(int j=0;j<arryOringal[0].length;j++)//二维数组的列
{
if(arryOringal[i][j]!=0)
{
size++;
}
}
}
int [][]sparseArr=new int[size+1][3];//定义稀疏数组
int count=0;//计数当前非0数
sparseArr[0][0]=arryOringal.length;
sparseArr[0][1]=arryOringal[0].length;
sparseArr[0][2]=size;
for(int i=0;i<arryOringal.length;i++)//二维数组的行
{
for(int j=0;j<arryOringal[0].length;j++)//二维数组的列
{
if(arryOringal[i][j]!=0)
{
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=arryOringal[i][j];
}
}
}
System.out.println("*********稀疏数组************");
//遍历稀疏数组
for(int []row: sparseArr)//增强for循环,得到的是一个一维数组(一行)
{
for(int val:row)//遍历得到的一维数组
{
System.out.print(val+"\t");
String content=val+"\t";
out.write(content);
}
System.out.println("\n");//输出一行换行
out.write("\r\n");
}
out.close();
/*从txt中读入稀疏数组并还原为二维数组*/
BufferedReader in = new BufferedReader(new FileReader(file));
BufferedReader in2 = new BufferedReader(new FileReader(file));
String line; //一行数据
int row=0;//逐行读取,并将每个数组放入到数组中
int totalRow=0;//获取总行数以得到定义数组的行数
while((line = in.readLine()) != null){
totalRow++;
}
in.close();
int[][]ArrayNow=new int [totalRow][totalRow];
int [][]SparseArr2=new int[totalRow][3];
while((line = in2.readLine()) != null)
{
String[] temp = line.split("\t");
for(int j=0;j<temp.length;j++)
{
SparseArr2[row][j] = Integer.parseInt(temp[j]);
}
row++;
}
in2.close();
System.out.println("*********从txt还原的稀疏数组************");
for(int []row2: SparseArr2)//增强for循环,得到的是一个一维数组(一行)
{
for(int val:row2)//遍历得到的一维数组
{
System.out.print(val+"\t");
}
System.out.println("\n");//输出一行换行
}
System.out.println("*********稀疏数组还原二维数组************");
for(int i=1;i<SparseArr2.length;i++)//二维数组的行
{
ArrayNow[SparseArr2[i][0]][SparseArr2[i][1]]=SparseArr2[i][2];
}
for(int []row3: ArrayNow)//增强for循环,得到的是一个一维数组(一行)
{
for(int val:row3)//遍历得到的一维数组
{
System.out.print(val+"\t");
}
System.out.println("\n");//输出一行换行
}
}
}
结果展示
*********原二维数组************
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 3 0 0 0 0 0 0 0
0 0 0 0 4 0 0 0 0 0 0
0 0 0 0 0 5 0 0 0 0 0
0 0 0 0 0 0 6 0 0 0 0
0 0 0 0 0 0 0 7 0 0 0
0 0 0 0 0 0 0 0 8 0 0
0 0 0 0 0 0 0 0 0 9 0
0 0 0 0 0 0 0 0 0 0 10
*********稀疏数组************
11 11 10
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
10 10 10
*********从txt还原的稀疏数组************
11 11 10
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
10 10 10
*********稀疏数组还原二维数组************
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 3 0 0 0 0 0 0 0
0 0 0 0 4 0 0 0 0 0 0
0 0 0 0 0 5 0 0 0 0 0
0 0 0 0 0 0 6 0 0 0 0
0 0 0 0 0 0 0 7 0 0 0
0 0 0 0 0 0 0 0 8 0 0
0 0 0 0 0 0 0 0 0 9 0
0 0 0 0 0 0 0 0 0 0 10