码迷,mamicode.com
首页 > 编程语言 > 详细

结构一 - 稀疏数组

时间:2020-06-27 00:06:54      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:序列化   接收   pack   n+1   关系   反序   pac   mic   文件   

棋盘

技术图片

现在有一个11*11的棋盘如图,需要表示出棋盘和棋子的关系。
用二维数组表示,用0表示空白,1表示黑子,2表示蓝子,此时二维数组中有效的数据为2个,剩下的均为0。
这个时候又需要将当前的棋盘序列化到磁盘上,那么浪费了非常多的空间来存储0。
我们可以用稀疏数组来解决这个问题。

稀疏数组

顾名思义稀疏就是将数组中稀疏分布的有效数据存储起来作为一个新的数组。
稀疏数组的结构有两部分第一部分是第一个数据,存储原始数组的行列数有效数据个数。第二部分是剩下的所有的数据,这是数组的有效数据。
二维数组的稀疏数组:

行数 row column value
1 原始数组有11行 原始数组有11列 有效数据有2个
2 第一条有效数据的行数 第一条有效数据的列数 第一条有效数据的值
... ... ... ...
n+1 第n条有效数据的行数 第n条有效数据的列数 第n条有效数据的值

将原数组转化为稀松数组后

技术图片

需求:将上述二维数组转换为稀疏数组,然后序列化到本地磁盘,接着再反序列化重新转换为二维数组。

package com.cnblog.sparearray;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;

public class SoarseArrayTest {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		int[][] chessArr = new int[11][11];
		chessArr[1][2] = 1;
		chessArr[2][3] = 2;
		// 序列化
		serializeArr(chessArr);
		// 反序列化
		deserializationArr();
	}
	/**
	 * 将二维数组序列化至本地磁盘
	 * @param chessArr
	 * @throws IOException 
	 */
	public static void serializeArr(int[][] chessArr) throws IOException{
		
		// 将二维数组先转换为稀疏数组,
		// 审查有效数据
		int num = 0;
		for (int[] row : chessArr){
			for (int data : row) {
				if (data != 0){
					num++;
				}
			}
		}
		
		// 创建稀疏数组 length = num + 1;第一行要先存上值;列数必然为3
		int[][] sparseArr = new int[num + 1][3]; 
		sparseArr[0][0] = chessArr.length;
		sparseArr[0][1] = chessArr[0].length;
		sparseArr[0][2] = num;
		
		// 循环存入稀松数组
		int count = 1;
		for (int i = 0; i < chessArr.length; i++) {
			for (int j = 0; j < chessArr[0].length; j++) {
				if (chessArr[i][j]!=0){
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = chessArr[i][j];
					count++;
				}
			}
		}
		for (int[] row : sparseArr) {
			System.out.println(Arrays.toString(row));
		}
		
		// 创建序列化流序列化数据
		FileOutputStream fos = new FileOutputStream("D:/JavaIO/file.data");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(sparseArr);
		oos.close();
	}
	/**
	 * 将本地磁盘的文件读取还原为二维数组并打印输出
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
	public static void deserializationArr() throws FileNotFoundException, IOException, ClassNotFoundException{

		// 反序列化
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/JavaIO/file.data"));
		int[][] sparseArr = (int[][]) ois.readObject();
		// 创建二维数组接收数据
		
		int[][] chessArr = new int[sparseArr[0][0]][sparseArr[0][1]];
		for (int i = 1; i < sparseArr.length; i++) {
			chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}
		
		for (int[] row : chessArr){
			System.out.println(Arrays.toString(row));
		}
	}
}

运行结果

技术图片

结构一 - 稀疏数组

标签:序列化   接收   pack   n+1   关系   反序   pac   mic   文件   

原文地址:https://www.cnblogs.com/torain/p/13196781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!