当一个数组中大部分元素为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(); } } }