稀疏数组

稀疏数组和队列

  1. 应用场景

    编写五子棋

  2. 基本介绍
    当一个数组的大部分元素为0、或者为同一个值时,可以使用稀疏数组来保存该数组
    处理方法:
    1)、记录数组一共有几行几列,有多少个不同的值
    2)、把具有不同值得元素得行列及值记录在一个小规模的数组。
    在这里插入图片描述

  3. 应用实例
    编写五子棋的棋盘
    在这里插入图片描述

    二维数组转稀疏数组的思路:

    - 遍历原始的二维数组,得到有效的个数sum
    - 根据sum创建稀疏数组的大小
    - 将二维数组的有效数据存入稀疏数组
    

    稀疏数组转原始的二维数组的思路:

    - 先读取第一行第一列,根据所得到得的第一行数据,创建原始的二维数组
    - 在读取后面几行的数据,并赋值给原始的二维数组即可
    
  4. 代码

public class SpraseArray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//创建原始的二维数组,0:没有,1:黑色,2:蓝色
		int chassArr1[][] = new int[11][11];
		chassArr1[1][2] = 1;
		chassArr1[2][3] = 2;
		//输出原始的二维数组
		
		for(int[] row:chassArr1) {
			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(chassArr1[i][j]!=0) {
					sum++;
					
				}
			}
			
		}
		
		//2
		int spraseArr[][] = new int[sum+1][3];
		
		spraseArr[0][0] = 11;
		spraseArr[0][1] = 11;
		spraseArr[0][2] = sum;
		//将非零的数组放入在稀疏数组中
		
		int count=0;
		for (int i = 0; i < 11; i++) {
			for (int j = 0; j < 11; j++) {
				if(chassArr1[i][j]!=0) {
					count++;
					spraseArr[count][0] = i;
					spraseArr[count][1] = j;
					spraseArr[count][2] = chassArr1[i][j];
					
				}
			}		
		}
		System.out.println("得到的稀疏数组");
		for (int i = 0; i < spraseArr.length; i++) {
			System.out.printf("%d\t%d\t%d\t",spraseArr[i][0],spraseArr[i][1],spraseArr[i][2]);
			System.out.println();
		}
		
		//将稀疏数组转化成二维数组
		//读取第一行
		System.out.println("恢复后的二维数组");
		int chassArr2[][] = new int[spraseArr[0][0]][spraseArr[0][1]];
		for(int i=1;i<spraseArr.length;i++) {
			chassArr2[spraseArr[i][0]][spraseArr[i][1]] = spraseArr[i][2];
		}

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

}

  1. 课后练习
    在前面的基础上,将稀疏数组保存到磁盘上,在恢复原来的数组,读取map.data进行恢复
import java.io.*;
 
/**
 * 稀疏数组
 */
public class Sparsearray {
    //棋盘的行数
    public static final int row = 11;
    //棋盘的列数
    public static final int col = 11;
    //创建保存稀疏数组的文件(当前项目跟路径下)
    File file = new File(  "/map.data");
 
    public static void main(String[] args) throws Exception{
        Sparsearray spa = new Sparsearray();
        //获取稀疏数组
        spa.getSparseArr();
        //把稀疏数组还原成二维数组
        spa.restore();
    }
 
    //获取稀疏数组
    public void getSparseArr() {
        //创建初始二维数组  11 * 11
        int chessArr[][] = new int[row][col];
        // 0表示没有棋子,1 表示白棋,2表示黑棋
        chessArr[2][5] = 2;
        chessArr[5][4] = 1;
        chessArr[5][3] = 1;
        chessArr[6][5] = 2;
        System.out.println("初始数组");
        // 获取非0个数
        int sum = 0;
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
                if (data != 0)
                    sum++;
            }
            System.out.println();
        }
        //创建稀疏数组
        int sparseArr1[][] = new int[sum + 1][3];
        //给稀疏数组赋初始值
        sparseArr1[0][0] = chessArr.length;//行数
        sparseArr1[0][1] = chessArr[1].length;//列数
        sparseArr1[0][2] = sum;//有几个非0的值
        //创建行计数器
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr[0].length; j++) {
                if (chessArr[i][j] != 0) {
                    count++;
                    sparseArr1[count][0] = i;
                    sparseArr1[count][1] = j;
                    sparseArr1[count][2] = chessArr[i][j];
                }
            }
        }
        System.out.println("稀疏数组");
        for (int[] row : sparseArr1 ) {
            for (int col : row ) {
                System.out.printf("%d\t", col);
            }
            System.out.println();
        }
        //把棋盘存档,保存在本地磁盘
        download(sparseArr1);
    }
 
    //把稀疏数组还原成二维数组
    public int[][] restore() throws Exception{
        //读档,获取保存在本地磁盘的稀疏数组
        int[][] sparseArr2 = read();
        //创建还原稀疏数组的二维数组对象
            int[][] chessArr2 = new int[row][col];
            System.out.println("===================从磁盘还原成稀疏数组===================");
            //把稀疏数组还原成二维数组
            for (int i=0;i<sparseArr2.length;i++){
                System.out.printf("%d\t%d\t%d\t\n",sparseArr2[i][0],sparseArr2[i][1],sparseArr2[i][2]);
                if (i!=0)
                chessArr2[sparseArr2[i][0]] [sparseArr2[i][1]]= sparseArr2[i][2];
            }
            System.out.println("===================稀疏数组还原成二位数组===================");
            for (int [] row :chessArr2){
                for (int data:row){
                    System.out.printf("%d\t",data);
                }
                System.out.println();
            }
            return chessArr2;
 
 
    }
 
    //把棋盘存档,保存在本地磁盘
    public void download(int[][]sparseArr1){
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file.getPath());
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
            for (int i = 0; i < sparseArr1.length; i++) {
                //把稀疏数组保存到磁盘中
                outputStreamWriter.write(sparseArr1[i][0] + "," + sparseArr1[i][1] + "," + sparseArr1[i][2] + ",");
            }
            //关闭输出流
            outputStreamWriter.close();
            fileOutputStream.close();
            System.out.println("===================把稀疏数组保存到磁盘成功===================");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("===================把稀疏数组保存到磁盘失败===================");
        }
    }
 
    //读档,从本地磁盘中读取
    public int[][] read() throws Exception {
        if (!file.exists()){
            System.out.println("===================磁盘中不存在map.data文件===================");
            return null;
        }
        System.out.println("===================从磁盘中读取map.data文件===================");
        FileInputStream fileInputStream = new FileInputStream(file);
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"UTF-8");
        StringBuffer stringBuffer = new StringBuffer();
        while (inputStreamReader.ready()){
            stringBuffer.append((char)inputStreamReader.read());
        }
        System.out.println("===================读取成功===================");
        //关闭输入流
        inputStreamReader.close();
        fileInputStream.close();
        //创建一个数组,用来接收稀疏数组保存在磁盘中的值
        String[] sparse = stringBuffer.toString().split(",");
        //创建一个稀疏数组,用来接收之前保存在磁盘中的值
        int[][] sparseArr2 = new int[sparse.length/3][3];
        for (int i =0;i<sparse.length;i++){
            sparseArr2[i/3][i%3] =Integer.valueOf(sparse[i]);
        }
        return sparseArr2;
    }
}

  1. 总结
    对与数组就有多个相同的元素时,可以将其压缩为稀疏数组。掌握了如何将稀疏数组转换成二维数组,二维数组转换成稀疏数组。猜想可以应用于多维数组。

版权声明:本文为MGfanfan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。