文章目录
基本介绍
当一个数组中大部分元素为0,或者为同一个值的时候,可以使用稀疏数组来保存该数组以节省空间.
处理方法:
1:记录源数组的行数列数与值(不重复)的数目
2:把这些值放在一个x行3列的二维数组中存储(x为有效值数+1)
如下图就是一个重复元素较多的数组,因此外面可以考虑采用稀疏数组的方式存储该数组
下图就是转换后的稀疏数组,其中第一行第一列代表源数组行数,第一行第二列代表源数组列数,第一行第三列代表源数组有效值个数.
之后的每一行的第一列代表有效值所在的行对应的数组索引,第二列代表有效值所在的列对应的数组索引,第三列代表对应的值
一、代码
package algorithm.DataStruct.Array;
import java.io.*;
import java.util.Arrays;
/**
* @author: Serendipity
* Date: 2022/1/25 10:52
* Description:稀疏数组 x行3列(x为源数组数据个数+1)
* arrays[0][0]=行数 arrays[0][1]=列数 arrays[0][2]=值数
* 第一列:源数据所在行
* 第二列:源数据所在列
* 第三列:源数据所在值
* 最后需要了解如何将数组写入并读出文件
*/
public class SparseArray {
private int row;
private int col;
private int val;
public SparseArray() {
}
public SparseArray(int row, int col, int val) {
this.row = row;
this.col = col;
this.val = val;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public static void main(String[] args) {
final int ROW=5;final int COL=5;
int[][]chess=new int[ROW][COL];int sum=0;
SparseArray[]spareArr=new SparseArray[(int)Math.sqrt(chess.length)];
chess[1][2]=1;chess[2][3]=1;
for(int i=0;i<chess.length;i++){ //显示棋盘
for (int j = 0; j < chess[i].length; j++) {
System.out.printf("%5d",chess[i][j]);
if(chess[i][j]!=0){
spareArr[sum++]=new SparseArray(i,j,chess[i][j]);
}
}
System.out.println();
}
int[][]sparseArray=new int[sum+1][3];
sparseArray[0][0]=chess.length;sparseArray[0][1]=chess[0].length;sparseArray[0][2]=sum;
for(int i=1;i<sparseArray.length;i++){
sparseArray[i][0]=spareArr[i-1].getRow();
sparseArray[i][1]=spareArr[i-1].getCol();
sparseArray[i][2]=spareArr[i-1].getVal();
}
// System.out.println(Arrays.deepToString(sparseArray));
try(FileWriter fw=new FileWriter(new File("D:\\desktopfile\\file.txt"))) {
for(int i=0;i<sparseArray.length;i++){
for (int j=0;j<sparseArray[0].length;j++){
fw.write(sparseArray[i][j]+"\t");
}
fw.write("\r\n");
}
} catch (IOException e) {
e.printStackTrace();
}
String line;int[][]temp=null;
try(BufferedReader br=new BufferedReader(
new FileReader(new File("D:\\desktopfile\\file.txt")))){
while((line=br.readLine())!=null) {
String[] split = line.split("\t"); //这个数组就3个元素
if(temp==null){
temp=new int[Integer.parseInt(split[0])][Integer.parseInt(split[1])];
}else {
temp[Integer.parseInt(split[0])][Integer.parseInt(split[1])]
= Integer.parseInt(split[2]);
}
}
System.out.println(Arrays.deepToString(temp)); //二维数组就应该使用这个方法
}catch (IOException e){
e.printStackTrace();
}
}
}