初学数据结构与算法【稀疏数组】

稀疏数组

一、main方法

代码如下(示例):

public static void main(String[] args)
	{

		//创建一个二维数组,输出
		int chessArr1[][]=new int[11][11];
		//int[][] chessArr1=new int[11][11];
		chessArr1[1][2]=1;
		chessArr1[2][3]=2;
		chessArr1[6][8]=1;
		chessArr1[7][9]=2;
		System.out.println("原始二维数组:");
		for(int[] row:chessArr1) {
			for(int date: row) {
				System.out.printf("%d\t", date);
			}
			System.out.println();
		}
		
		//调用toSparseArr方法,把二维数组转化为稀疏数组
		int[][] sparseArr=ToSparseArr(chessArr1);
		//调用WriterMapDate方法,把稀疏数组存储到map.date文件中
		writerMapDate(sparseArr);
		//调用readMapDate方法,读取map.date文件中稀疏数组
		String[] sb1=readMapDate();
		//调用ToChessArr方法,将读取的稀疏数组转换为二维数组
		ToChessArr(sb1);

二、ToChessArr方法:二维数组转稀疏数组

代码如下(示例):

public static void ToChessArr(String[] sb1)
	{
		int num2=1;
		int[][] sparseArr1=new int[sb1.length/3][3];
		sparseArr1[0][0]=Integer.parseInt(sb1[0]);
		sparseArr1[0][1]=Integer.parseInt(sb1[1]);
		sparseArr1[0][2]=Integer.parseInt(sb1[2]);
		for(int i=3;i<sb1.length;i+=3){
			sparseArr1[num2][0]=Integer.parseInt(sb1[i]);
			sparseArr1[num2][1]=Integer.parseInt(sb1[i+1]);
			sparseArr1[num2][2]=Integer.parseInt(sb1[i+2]);
			num2++;
		}
		System.out.println("还原稀疏数组:");
		System.out.println("row"+"\t"+"col"+"\t"+"val");
		for(int[] row:sparseArr1){
			for(int data:row){
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
		System.out.println("还原原始数组:");
		int[][] chessArr2=new int[sparseArr1[0][0]][sparseArr1[0][1]];
		for(int i=1;i<sparseArr1.length;i++){
			chessArr2[sparseArr1[i][0]][sparseArr1[i][1]]=sparseArr1[i][2];
		}

		for(int[] row:chessArr2){
			for(int data:row){
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}

三.writerMapDate()把稀疏数组写入文件

代码如下(示例):

public static void writerMapDate(int[][] sparseArr)
	{
		try{
			System.out.println("创建/打开文档");
			File f=new File(path);
			FileOutputStream f1=new FileOutputStream(f);
			OutputStreamWriter outf=new OutputStreamWriter(f1,"UTF-8");
			System.out.println("写入中………………");
				for(int i=0;i<sparseArr.length;i++){
				outf.write(String.valueOf(sparseArr[i][0]));
				outf.write(",");
				outf.write(String.valueOf(sparseArr[i][1]));
				outf.write(",");
				outf.write(String.valueOf(sparseArr[i][2]));
				outf.write(",");
			}
			outf.close();
			f1.close();
			System.out.println("写入成功");
		}catch(IOException e){
			e.printStackTrace();
		}
	}

四、readMapDate() 稀疏数组转二维数组:读取稀疏数组文件

代码如下(示例):

public static String[] readMapDate()
	{
		try 
		{
			System.out.println("读取中………………");
			FileInputStream f2=new FileInputStream(new File(path));
			InputStreamReader inf=new InputStreamReader(f2,"UTF-8");
			StringBuffer sb=new StringBuffer();
			while(inf.ready()){
				sb.append((char)inf.read());
			}
			inf.close();
			f2.close();
			System.out.println("读取成功");
			String ss=sb.toString();
			String[] sb1=sb.toString().split(",");
			System.out.println("读取数据字符串为:");
			System.out.println(ss);
			return sb1;
		}catch(IOException e){
			e.printStackTrace();
		}
		return null;
	}

五、ToChessArr()稀疏数组转二维数组

代码如下(示例):

public static void ToChessArr(String[] sb1)
	{
		int num2=1;
		int[][] sparseArr1=new int[sb1.length/3][3];
		sparseArr1[0][0]=Integer.parseInt(sb1[0]);
		sparseArr1[0][1]=Integer.parseInt(sb1[1]);
		sparseArr1[0][2]=Integer.parseInt(sb1[2]);
		for(int i=3;i<sb1.length;i+=3){
			sparseArr1[num2][0]=Integer.parseInt(sb1[i]);
			sparseArr1[num2][1]=Integer.parseInt(sb1[i+1]);
			sparseArr1[num2][2]=Integer.parseInt(sb1[i+2]);
			num2++;
		}
		System.out.println("还原稀疏数组:");
		System.out.println("row"+"\t"+"col"+"\t"+"val");
		for(int[] row:sparseArr1){
			for(int data:row){
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
		System.out.println("还原原始数组:");
		int[][] chessArr2=new int[sparseArr1[0][0]][sparseArr1[0][1]];
		for(int i=1;i<sparseArr1.length;i++){
			chessArr2[sparseArr1[i][0]][sparseArr1[i][1]]=sparseArr1[i][2];
		}

		for(int[] row:chessArr2){
			for(int data:row){
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}

六、 结果

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值