稀疏矩阵的作用
实现稀疏矩阵
将一个二维数组压缩成稀疏矩阵然后用IO流保存再读出解压为二维数组。如图所示
实现代码如下:
package com.yzx.顺序结构;
import java.io.*;
/**
* 稀疏矩阵
*/
public class SparseArray {
public static int count;
public static void main(String[] args) throws Exception {
//1.创建一个二维数组模拟棋盘
int[][] a01 = new int[11][11];
sumCount(a01);
//赋值黑棋为0,,白棋为1
a01[1][2] = 1;
a01[2][3] = 2;
//打印输出
System.out.println("=========原始棋盘===========");
printArray(a01);
System.out.println("===========对应的稀疏矩阵=============");
//2.转化为稀疏数组
int[][] sa01 = new int[count + 1][3];
sa01[0][0] = 11;
sa01[0][1] = 11;
sa01[0][2] = count;
int sum = 1;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (a01[i][j] != 0) {
sa01[sum][0] = i;
sa01[sum][1] = j;
sa01[sum][2] = a01[i][j];
sum++;
}
}
}
//打印稀疏矩阵
printSArray(sa01);
try {
saveSArray(sa01);
} catch (IOException e) {
e.printStackTrace();
}
//文件读取
int[][] a03 = putSArray();
System.out.println("=======还原后的棋盘========");
//打印数组a03
printArray(a03);
}
/**
* 打印二维数组
* @param a
*/
public static void printArray(int[][] a){
for (int i=0;i<11;i++){
for (int item:a[i]){
if (item!=0){
count++;
}
System.out.printf("%d\t",item);
}
System.out.println();
}
}
/**
* 打印稀疏矩阵
* @param sa
*/
public static void printSArray(int[][] sa){
for (int i = 0; i < count+1; i++) {
for (int item:sa[i]) {
System.out.printf("%d\t",item);
}
System.out.println();
}
}
/**
* 计算数组中非零元素的个数
* @param a
*/
public static void sumCount(int[][] a){
count = 0;
for (int i=0;i<11;i++){
for (int item:a[i]){
if (item!=0){
count++;
}
}
}
}
/**
* 保存压缩后的稀疏矩阵
* @param sa
*/
public static void saveSArray(int[][] sa) throws IOException {
File file = new File("data.txt");
BufferedWriter write = new BufferedWriter(new FileWriter(file));
for (int i = 0; i < count+1; i++) {
write.write(""+sa[i][0]+" "+sa[i][1]+" "+sa[i][2]+"\n");
write.flush();
}
if (write!=null){
write.close();
}
}
/**
* 写出压缩的稀疏矩阵
*/
public static int[][] putSArray() throws Exception {
File file = new File("data.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String str = null;
str=reader.readLine();
String[] strs = str.split(" ");
int[][] a = new int[Integer.valueOf(strs[0])][Integer.valueOf(strs[1])];
while ((str=reader.readLine())!=null){
strs = str.split(" ");
a[Integer.valueOf(strs[0])][Integer.valueOf(strs[1])] = Integer.valueOf(strs[2]);
}
if (reader!=null){
reader.close();
}
return a;
}
}
运行结果: