使用场景:
当一个表格中出现大量相同数字的时候,可以使用稀疏数组来保存数组,以此来节省内存的占用空间。(棋盘,地图等等)
基本思路:
//将原始矩阵转化为稀疏矩阵并存入磁盘中
1.遍历原始矩阵,记录有效数值的个数sum
2.创建一个(sum+1)行,3列的稀疏矩阵
3.遍历原始矩阵,将有效数值的行列和对应的数值存入稀疏矩阵中
4.将稀疏矩阵读入磁盘中
//从磁盘中读取稀疏矩阵,并转化为原始矩阵
1.从磁盘中读取信息并转为为稀疏矩阵
2.读取稀疏矩阵的第一行数据创建原始矩阵
3.从稀疏矩阵的第二行开始,依次读取数值到原始矩阵中
代码实现
package sparsearray;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class sparsearray {
public static void main(String[] args) throws Exception{
System.out.println("二维数组");
int[][] array1=new int[6][6];
array1[1][1]=2;
array1[2][2]=3;
int sum=0;
for(int[] row:array1){
for(int col:row){
System.out.print(col+"\t");
}
System.out.println();
}
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
if(array1[i][j]!=0){
sum++;
}
}
}
System.out.println();
System.out.println("数组有效数字总和");
System.out.println(sum);
System.out.println();
int[][] array2=new int[sum+1][3];
int count=0;
array2[0][0]=6;array2[0][1]=6;array2[0][2]=sum;
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
if(array1[i][j]!=0){
count++;
array2[count][0]=i;array2[count][1]=j;array2[count][2]=array1[i][j];
}
}
}
System.out.println("二维数组转稀疏数组");
for(int[] row:array2){
for(int data:row){
System.out.print(data+"\t");
}
System.out.println();
}
System.out.println("将稀疏列表存入磁盘");
File file=new File("D:\\eclipse\\sparsearray\\array.data");
FileOutputStream fileoutputstrea = new FileOutputStream(file);
OutputStreamWriter writer=new OutputStreamWriter(fileoutputstrea,"utf-8");
for(int i=0;i<array2.length;i++){
if(i==array2.length-1){
writer.write(array2[i][0]+","+array2[i][1]+","+array2[i][2]);
}else{
writer.write(array2[i][0]+","+array2[i][1]+","+array2[i][2]+",");
}
}
writer.close();
fileoutputstrea.close();
System.out.println("稀疏数组存入磁盘完毕");
System.out.println();
System.out.println("从磁盘中读取数据");
FileInputStream inputStream=new FileInputStream(file);
InputStreamReader reader=new InputStreamReader(inputStream,"utf-8");
StringBuffer sb=new StringBuffer();
while(reader.ready()){
sb.append((char)reader.read());
}
System.out.println("读出的文件为:"+sb.toString());
reader.close();
inputStream.close();
String[] str=sb.toString().split(",");
System.out.println("稀疏矩阵有:"+str.length/3+"行数据");
int[][] array3=new int[sum+1][str.length/3];
int k= 0;
for (String s:str) {
System.out.print(k%3+"\t");
array3[k/3][k%3] =Integer.parseInt(s);
k++;
}
System.out.println();
System.out.println("稀疏数组转二维数组");
int[][] array4=new int[array3[0][0]][array3[0][1]];
for(int i=1;i<=sum;i++){
array4[array3[i][0]][array3[i][1]]=array3[i][2];
}
for(int i=0;i<array4.length;i++){
for(int j=0;j<array4[0].length;j++){
System.out.print(array4[i][j]+"\t");
}
System.out.println();
}
}
}