稀疏数组day01

本文介绍稀疏数组的概念,通过示例演示如何将二维数组转换为稀疏数组,以及如何将稀疏数组恢复为原始二维数组。此外,文章还讲解了如何使用Java的FileWriter和FileReader进行文件的读写操作,实现稀疏数组的磁盘存储和恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性结构

线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
线性机构有两种不同的存储结构,即顺序存储(数组)链式存储(链表)。
顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的
链式存储的线性表称为链表,链表中的存储元素不一定是连续的
线性结构常见的有:数组、队列、栈和链表

非线性结构

非线性结构包括:二维数组、多维数组、广义表、树、图

稀疏数组

在这里插入图片描述
在这里插入图片描述

package com.xhl.sparsearray;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class SparseArray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个原始的二维数组
		//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<11;i++) {
			for(int j = 0;j<11;j++) {
				if(chessArr1[i][j]!=0) {
					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<11 && count<sum;i++) {
			for(int j = 0;j<11 && count<sum;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 i=0;i< sparseArr.length;i++) {
			System.out.printf("%d\t%d\t%d\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);			
		}
		System.out.println();
		
		
		//将稀疏数组--->恢复成原始的二维数组
		/*
		 * 1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
		 * 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();
		}
	}
	
}

运行结果:
在这里插入图片描述
课后练习:

  • 将稀疏数组保存到磁盘上,文件名map.data
  • 读取map.data恢复稀疏数组

知识点:文件及IO流

在这里插入图片描述
在这里插入图片描述
图中FileReader属于节点流,Reader就是处理流

package com.xhl.sparsearray.homework;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class SparseArray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个原始的二维数组
		//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<11;i++) {
			for(int j = 0;j<11;j++) {
				if(chessArr1[i][j]!=0) {
					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<11 && count<sum;i++) {
			for(int j = 0;j<11 && count<sum;j++) {
				if(chessArr1[i][j] !=0) {
					count ++;
					sparseArr[count][0]=i;
					sparseArr[count][1]=j;
					sparseArr[count][2]=chessArr1[i][j];
				}
			}
		}
		
		//创建输出流
		FileWriter writer = null;
		
		try {
			writer = new FileWriter("map.data");
			//输出稀疏数组的形式
			System.out.println();
			System.out.println("得到的稀疏数组为:");
			for(int i=0;i< sparseArr.length;i++) {
				System.out.printf("%d\t%d\t%d\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
				
				//利用IO流将稀疏数组写入
				if (i == sparseArr.length - 1) {
					writer.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2]);					
				}else {
					writer.append(sparseArr[i][0] + "," + sparseArr[i][1] + "," + sparseArr[i][2] + ",");										
				}
			}
			System.out.println();
			writer.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
				
		//将稀疏数组--->恢复成原始的二维数组
		/*
		 * 1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
		 * 2、在读取稀疏数组的后几行数据,并赋值给二维数组即可
		 */
		
		//1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
		
		FileReader reader = null;
		
		StringBuffer sb = new StringBuffer();
		try {
			reader = new FileReader("map.data");
			while (reader.ready()) {
				sb.append((char) reader.read());// 转成char加到StringBuffer对象中
			}
			System.out.println(sb.toString());
			reader.close();// 关闭读取流
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				if(reader != null) {
					reader.close();
				}
			}catch (IOException e){
				e.printStackTrace();
			}
		}
		
		String[] str = sb.toString().split(",");
		int chessArr2[][] = new int[str.length/3][3];
		// 给稀疏数组赋值
		int i = 0;
		for (String s : str) {
			chessArr2[(i - (i % 3)) / 3][i % 3] = Integer.parseInt(s);
			i++;
		}
		
		
		
		//输出恢复后的二维数组
		System.out.println();
		System.out.println("恢复后的二维数组为;");
		
		for(int[] row:chessArr2) {
			for(int data: row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}
	
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值