稀疏数组
1.稀疏数组
稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组
当一个数组中大部分元素为0,或者为同一值的数组时,我们可以用稀疏数组来保存该数组。在稀疏数组中,数组下标为[0]的第一行元素分别代表原始数组的行列数以及中的有效值(即非零值)的个数,再往下从稀疏数组第二行开始,每行的元素分别记录了各个有效值在原始数组中所在的位置以及有效值的值。例如下标为[1]的第二行中的元素表示记录了原始数组中array
二维数组 转 稀疏数组的思路
1. 遍历 原始的二维数组,得到有效数据的个数 sum
2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
3. 将二维数组的有效数据数据存入到 稀疏数组
稀疏数组转原始的二维数组的思路
1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
package com.atguigu.sparsearray;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
// write your code here
//稀疏数组
//11行11列2个值
int chessArr1[][]=new int[11][11];
chessArr1[1][2]=1;
chessArr1[2][3]=2;
for (int[] ints : chessArr1) {
for (int anInt : ints) {
System.out.print("\t"+anInt);
}
System.out.println();
}
System.out.println("-----------------二维数组转为稀疏数组-------------------------");
System.out.println("获取非0的值个数");
int sum=0;
for (int i = 0; i < 11; i++) {
for (int i1 = 0; i1 < 11; i1++) {
if(chessArr1[i][i1]!=0){
sum++;
}
}
}
System.out.println(sum);
//创建稀疏
int sparseArr[][]=new int[sum+1][3];
sparseArr[0][0]=11;
sparseArr[0][1]=11;
sparseArr[0][2]=sum;
int count=0;
for (int i = 0; i < 11; i++) {
for (int i1 = 0; i1 < 11; i1++) {
if(chessArr1[i][i1]!=0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=i1;
sparseArr[count][2]=chessArr1[i][i1];
}
}
}
File file=new File("D:\\map.data");
//存储稀疏数组
// try {
// FileOutputStream outputStream=new FileOutputStream(file);
//
// OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream,"Utf-8");
// System.out.println("写入中………………");
//
// for(int i=0;i<sparseArr.length;i++){
// outputStreamWriter.write(String.valueOf(sparseArr[i][0]));
// outputStreamWriter.write(",");
// outputStreamWriter.write(String.valueOf(sparseArr[i][1]));
// outputStreamWriter.write(",");
// outputStreamWriter.write(String.valueOf(sparseArr[i][2]));
// outputStreamWriter.write(",");
//
// }
// outputStreamWriter.close();
// outputStream.close();
// System.out.println("写入成功");
// } catch (IOException e) {
// System.out.println("写入失败");
// e.printStackTrace();
// }
//读取稀疏数组
try {
System.out.println("读取中----------");
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
StringBuffer stringBuffer = new StringBuffer();
while (inputStreamReader.ready()){
stringBuffer.append((char) inputStreamReader.read());
}
inputStreamReader.close();
String ss = stringBuffer.toString();
String[] sb1 = stringBuffer.toString().split(",");
System.out.printf("从磁盘读取的字符串为:\n%s\n", ss);//格式化输出
int num2=1;
int[][] sp=new int[sb1.length/3][3];
sp[0][0]=Integer.parseInt(sb1[0]);
sp[0][1]=Integer.parseInt(sb1[1]);
sp[0][2]=Integer.parseInt(sb1[2]);
for(int i=3;i<sb1.length;i+=3){
sp[num2][0]=Integer.parseInt(sb1[i]);
sp[num2][1]=Integer.parseInt(sb1[i+1]);
sp[num2][2]=Integer.parseInt(sb1[i+2]);
num2++;
}
System.out.println("还原稀疏数组:");
System.out.println("row"+"\t"+"col"+"\t"+"val");
for(int[] row:sp){
for(int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}catch (Exception e){
}
System.out.println("------------------------------------------------------------");
//输出稀疏
System.out.printf("%s\t%s\t%s\t%n","行","列","值");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t%n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
//恢复原始数组
int chessArr2[][]=new int[sparseArr[0][0]][sparseArr[0][1]];
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]]= sparseArr[i][2];
}
for (int[] ints : chessArr2) {
for (int anInt : ints) {
System.out.print("\t"+anInt);
}
System.out.println();
}
}
}



浙公网安备 33010602011771号