java实现稀疏矩阵的压缩与解压
任务要求
把棋盘当作一个稀疏矩阵,0表示没棋,1表示黑棋,2表示蓝棋。
把该稀疏矩阵压缩以三元组形式表示并以文件形式保存,再写另一个程序读取文件中的信息把压缩后的三元组还原成原来的稀疏矩阵。
其中三元组的第一行用来存储原始稀疏矩阵的行数、列数和有效的数据个数,其余行用来存储有效的非0数据

思路分析
稀疏矩阵的压缩
- 遍历原始的稀疏矩阵,得到有效的数据个数sum
- 根据sum创建三元组
new int [sum+1] [3](即sum+1行3列的二维数组) - 将二维数据的有效数据存入三元组中
稀疏矩阵的解压
- 先读取三元组的第一行,根据第一行的数据创建一个二维数组
- 再读取三元组的后面几行,并赋值给该二维数组即可
代码实现
稀疏矩阵的压缩
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实现稀疏矩阵的压缩与解压的更多相关文章
- java.util.zip.Deflater 压缩 inflater解压 实例
原文:java压缩解压缩类实例[转] package com.example.helloworld; import java.io.ByteArrayOutputStream; import java ...
- Java实现文件压缩与解压
Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...
- Java实现文件压缩与解压[zip格式,gzip格式]
Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...
- java压缩文件解压:调用WinRAR5命令强于自己写代码实现
最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的 1.解压rar格式,采用的是java-unrar-0.3.j ...
- java zip 压缩与解压
java zip 压缩与解压 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java. ...
- PAT(B) 1078 字符串压缩与解压(Java)
题目链接:1078 字符串压缩与解压 (20 point(s)) 题目描述 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 ...
- Java的压缩、解压及压缩加密、解密解压 样例
为了节约带宽.加快传送速度,http协议支持gzip的压缩,但假设我们的app与后台不是通过http协议通讯的.那么压缩.解压这个流程须要自己写.以下给出compress和decompress的代码: ...
- Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压
zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...
- 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)
OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...
随机推荐
- 图解python | 简介
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
- 【Java8新特性】Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序
一.序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常.Java8新特性之Optional为此类问题提供了优雅的解决方式. 广大程序员朋友对空值异 ...
- 如何把Spring学精通了?
作为 Java 后端工程师,几乎都要用到 Spring,今天这篇文章是和大家说说如何学好 Spring. 在之前的一篇 Java 读书路线的文章中,我介绍过 Spring 的读书路线: 虽然 Spri ...
- vscode打开多个文件
vscode短时间内打开多个文件会覆盖原先打开的文件,在右方编辑区只显示一个.若想每次打开,都新创建一个编辑,可以用以下2个简单的方法: 方法一:直接在右侧打开的文件上,Ctrl + S,保存一次,再 ...
- [题解]Mail.Ru Cup 2018 Round 1 - C. Candies Distribution
[题目] C. Candies Distribution [描述] n个小朋友排排坐吃糖糖,小朋友从左到右编号1到n.每个小朋友手上有一定数量的糖.对于第i个小朋友来说,编号比他小的小朋友中有li个小 ...
- RENIX报文字段跳变——网络测试仪实操
什么是报文字段跳变? 报文字段跳变是指字段的值进行一些列有规则的变化,Renix支持对字段进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IP变化的数据时,就可以使用Modifier进行规则 ...
- Three.js之绘制中文文字并跟随物体
本周更新的需求是物体上显示文字信息,效果图如下: 加载字体 import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.js'; ...
- 第一次接触数据库(SQLite)
第一次接触,学了创建列表 + 行的删除 + 内容的更改 + 删除列表 第一次接触要知道一些基本知识 NULL(SQL) = Nnoe(python) #空值 INTEGER = int #整数 R ...
- 解构函数(Deconstruct)
元组的解构是C#内置支持的. var countrInfo = ("Malawi", "Lilongwe", io); (string name, string ...
- Java中读写锁的介绍
读写锁的简单介绍 所谓的读写锁,就是将一个锁拆分为读锁和写锁两个锁,然后你加锁的时候,可以加读锁,也可以加写锁. ReentrantLock lock=new ReentrantLock(); loc ...