JAVA获取一个数组的稀疏数组,并将该稀疏数组写到文件中,最后再读取文件恢复成原来最开始的数组

  1. 如果一个二维数组有很多的元素是重复的,那么存储这个数组就比较废空间,可以用这个数组的稀疏数组,达到缩小数组规模的目的。
    在这里插入图片描述
    上面那个二维数组的稀疏数组如下图:
    在这里插入图片描述
    这个稀疏数组的第一行各个元素具体是什么含义,图中已经标明。
    至于第二行和第三行各个元素的含义,我只拿第二行举例(第三行可以类比)。
  • 第二行第3个元素:代表原数组中的元素“1”
  • 第二行第1个元素:元素“1”的行号索引,索引从0开始
  • 第二行第2个元素:元素“1”的列号索引,索引从0开始
    总之,第二行元素的含义,用一句话来讲,就是元素“1”在原数组中的第2行第3列(因为索引从0开始,也就是1+1行,2+1列)。
  1. 搞明白了稀疏数组的含义,那么,有两个任务去做
  • 原始数组→稀疏数组;
  • 稀疏数组→原始数组
    也就是在这两个数组之间进行转换。
    第一个任务相对复杂一点,第二个任务很简单。
  1. 下面是完整的代码,数组转换部分参考了教学视频,IO部分是教学视频给出的作业,自己随便写的,可能写得不好。
package sparsearray;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;

public class Demo2 
{
	public static void main(String[] args) throws Exception
	{
		//定义原始的数组
		int [][] chessArray=new int[11][11];//元素的默认值是0
		chessArray[1][2]=1;//黑色的棋子
		chessArray[2][3]=2;	//蓝色的棋子
		for (int[] is : chessArray)
		{
			for (int a : is) 
			{
				System.out.print(a+"\t");
			}
			System.out.println();
		}
		
		int sum=0;//总共有多少个不同的值
		for (int i = 0; i < chessArray.length; i++) //chessArray.length其实是二维数组的行数
		{
			for (int j = 0; j < chessArray.length; j++) //遍历一行,也就是一维数组,这里行数和列数相等,所以可以用chessArray.length
			{
				if(chessArray[i][j]!=0)
				{
					sum++;
				}
			}
		}
		
		//定义一个稀疏数组
		int [][] sparseArray=new int[sum+1][3];//稀疏数组的列数是固定的“3”
		//给稀疏数组的元素赋值
		sparseArray[0][0]=11;
		sparseArray[0][1]=11;
		sparseArray[0][2]=sum;
		int count=0;
		for (int i = 0; i < 11; i++) 
		{
			for (int j = 0; j < 11; j++) 
			{
				if(chessArray[i][j]!=0)
				{
					count++;
					sparseArray[count][0]=i;
					sparseArray[count][1]=j;
					sparseArray[count][2]=chessArray[i][j];
				}
			}
		}
		
		System.out.println("-----------------------------");
		System.out.println("稀疏数组:");
		//打印被赋值之后的稀疏数组
		for (int[] is : sparseArray) 
		{
			for ( int s2 : is) 
			{
				System.out.print(s2+"\t");
			}
			System.out.println();
		}
		System.out.println("-----------------------------");
		System.out.println("把稀疏数组保存到文件中。。。");
		FileOutputStream fileOutputStream=new FileOutputStream(new File("chess.txt"));
		
		for (int i = 0; i < sparseArray.length; i++) 
		{
			for (int j = 0; j < 3; j++) 
			{
				int a=sparseArray[i][j];
				if(j==2)//如果是最后一列就不加逗号
				{
					fileOutputStream.write((String.valueOf(a)).getBytes());
				}
				else //否则就加逗号
				{
					fileOutputStream.write((String.valueOf(a)+",").getBytes());
				}
			}
			fileOutputStream.write("\n".getBytes());
		}
		System.out.println("------------------");
		System.out.println("读取文件中的稀疏数组并恢复成原来的数组:");
		
		BufferedReader bufferedReader=new BufferedReader(new FileReader("chess.txt"));//字符缓冲流
		String line=null;
		int c=0;
		String row=null;
		String col=null;
		int [][] chessRestore=null;
		while((line=bufferedReader.readLine())!=null)
		{
			c++;
			if(c==1)//如果是稀疏矩阵的第一行
			{
				String [] array=line.split(",");
				row=array[0];
				col=array[1];
				chessRestore=new int[Integer.parseInt(row)][Integer.parseInt(col)];
			}
			else 
			{
				String [] array=line.split(",");
				String hang=array[0];
				String lie=array[1];
				String val=array[2];
				chessRestore[Integer.parseInt(hang)][Integer.parseInt(lie)]=Integer.parseInt(val);
			}
			
			
		}
		
		for (int[] is : chessRestore) 
		{
			for (int is2 : is) 
			{
				System.out.print(is2+"\t");
			}
			System.out.println();
		}
		
		
		
	}

}

  1. 运行结果:
    在这里插入图片描述
    之所以要把稀疏数组保存到文件中,是因为五子棋游戏要求有存档的功能,肯定要把棋盘保留下来。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值