任务要求

把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋。

把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写另一个程序读取文件中的信息把压缩后的三元组还原成原来的稀疏矩阵。

其中三元组的第一行用来存储原始稀疏矩阵的行数、列数和有效的数据个数,其余行用来存储有效的非0数据

思路分析

稀疏矩阵的压缩

  1. 遍历原始的稀疏矩阵,得到有效的数据个数sum
  2. 根据sum创建三元组new int [sum+1] [3](即sum+1行3列的二维数组)
  3. 将二维数据的有效数据存入三元组中

稀疏矩阵的解压

  1. 先读取三元组的第一行,根据第一行的数据创建一个二维数组
  2. 再读取三元组的后面几行,并赋值给该二维数组即可

代码实现

稀疏矩阵的压缩

package zone.lxy.sparsearray;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; /*
* 把稀疏矩阵压缩成三元组
* */
public class Compress {
public static void main(String[] args) throws IOException {
// 创建一个稀疏矩阵11*11
// 0表示没有棋子
// 1表示黑子
// 2表示白子
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2; // 输出原始的稀疏矩阵
System.out.println("原始的稀疏矩阵:");
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
System.out.print(chessArr1[i][j] + " ");
}
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; // 3.把稀疏矩阵中的非0元素放到三元组中
int count = 1;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr1[i][j] != 0) {
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr1[i][j];
count++;
}
}
} // 输出生成的三元组
System.out.println("得到压缩后的三元组:");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
}
// 把该三元组以文件形式保存起来,压缩完成
FileOutputStream fos = new FileOutputStream("map.data");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(sparseArr);
oos.close();
fos.close();
}
}
// 输出结果
原始的稀疏矩阵:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
得到压缩后的三元组:
11 11 2
1 2 1
2 3 2

稀疏矩阵的解压

package zone.lxy.sparsearray;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; /*
* 把三元组还原成稀疏矩阵
* */
public class DeCompress {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 读取文件并赋值
FileInputStream fis = new FileInputStream("map.data");
ObjectInputStream ois = new ObjectInputStream(fis);
int[][] sparseArr = (int[][]) ois.readObject();
ois.close();
fis.close();
// 输出文件中的存储的三元组
System.out.println("得到压缩后的三元组:");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
}
// 先读取三元组的第一行,根据第一行数据创建原始的稀疏矩阵
int row = sparseArr[0][0];
int col = sparseArr[0][1];
int[][] chessArr = new int[row][col]; // 从第二行开始读取三元组并赋值给稀疏矩阵
for (int a = 1; a <sparseArr.length; a++) {
int i = sparseArr[a][0];
int j = sparseArr[a][1];
int val = sparseArr[a][2];
chessArr[i][j] = val;
}
// 输出解压后的稀疏矩阵
System.out.println("解压后的二维数组:");
for (int[] i : chessArr) {
for (int item : i) {
System.out.printf("%d ", item);
}
System.out.println();
}
}
}
// 输出结果
得到压缩后的三元组:
11 11 2
1 2 1
2 3 2
解压后的二维数组:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

java实现稀疏矩阵的压缩与解压的更多相关文章

  1. java.util.zip.Deflater 压缩 inflater解压 实例

    原文:java压缩解压缩类实例[转] package com.example.helloworld; import java.io.ByteArrayOutputStream; import java ...

  2. Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  3. Java实现文件压缩与解压[zip格式,gzip格式]

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...

  4. java压缩文件解压:调用WinRAR5命令强于自己写代码实现

    最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.j ...

  5. java zip 压缩与解压

    java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java. ...

  6. PAT(B) 1078 字符串压缩与解压(Java)

    题目链接:1078 字符串压缩与解压 (20 point(s)) 题目描述 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 ...

  7. Java的压缩、解压及压缩加密、解密解压 样例

    为了节约带宽.加快传送速度,http协议支持gzip的压缩,但假设我们的app与后台不是通过http协议通讯的.那么压缩.解压这个流程须要自己写.以下给出compress和decompress的代码: ...

  8. Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

    zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...

  9. 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)

    OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...

随机推荐

  1. 盘点Go中的开发神器

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...

  2. [数分笔记]Dedekind切割定理的证明

    1.定理内容 Dedekind切割定理:设是实数集的一个切割,则或者有最大数,或者有最小数. 2.证明过程 设是中所有有理数所构成的集合,是中所有有理数所构成的集合 从而构成一个有理数集的切割 有三种 ...

  3. 如何将k8s中的某些节点单独、仅给某些应用来使用

    1.概述 在k8s集群的使用场景中有这样的一种情况,某些机器只给某些特殊的应用来使用.那么,这个时候,需要有以下的2个条件来进行保障: 节点不允许其他的pod来使用 应用只允许被调度到该节点上 2.实 ...

  4. 由浅入深--第一个MyBatis程序

    话不多说,马上开始我们的第一个Mybatis程序: 第一个程序,当然要参考MyBatis的官网文档来搞,地址如下:https://mybatis.org/mybatis-3/zh/getting-st ...

  5. Specified cast is not valid(C#) 引发的思考(装箱,拆箱本质)

    没有很华丽的语言,直接拿代码说事情把. 这段代码,会报错吗?  结论:当然不会 这段代码会报错了.原因是为啥? 这里面的水比较深.也要提醒各位写代码的适合要引起注意.异常:System.Invalid ...

  6. 导出QQ聊天记录并用python处理

    今天和天天弟弟聊天,很有感慨,想把聊天记录保存下来(QQ),教程如下. STEP1  从QQ里导出聊天记录 有两个方法导出:(1)打开聊天窗口中的"聊天记录",右下角是消息管理器, ...

  7. cpolar——安全的内网穿透工具

    什么是cpolar? cpolar是一种安全的内网穿透云服务,它将内网下的本地服务器通过安全隧道暴露至公网,使得公网用户可以正常访问内网服务. 它能用在哪些场景? 微信公众号开发,实时断点调试微信消息 ...

  8. LeetCode-107-二叉树的层序遍历 II

    二叉树的层序遍历 II 题目描述:给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例说明请见LeetCode官网. 来源:力扣(Leet ...

  9. 『现学现忘』Docker基础 — 11、Docker安装的问题补充

    目录 1.问题复现 2.解决冲突 3.重新安装docker-ce-selinux 4.安装Docker-ce 5.总结 通过yum安装Docker的时候,安装20版本的Docker没有出现问题,在安装 ...

  10. 【python】kNN基础算法--推荐系统

    虽然把text转成全部量化是可以的,但是还是需要把text转成numpy的形式(这个是必须掌握的) 在将数据输入到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式. 数据规范化.数据归一化 ...