稀疏数组

稀疏数组:

 当一个数组(包括多维数组)中大部分元素为0,或者为同一个值的数组时,,为了节约空间起到压缩的效果,将数据用另一种结构来表示,即稀疏数组。

稀疏数组的处理方法是:

 记录数组一共有几行几列,有多少个不同的值
 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

如二维数组如下
共4行5列,其中大部分值为0,3个非0数值

{
  0   0   6   0   0
  5   0   0   9   0
  0   0   0   0   0
  0   0   0   0   0
}

转为稀疏数组如下
其中第一行[0][0],[0][1],[0][2]表示原始数组的行数、列数、非0的个数
后面的3行中的每一行表示一个非0数值所在的行列及值的大小,如(0,3,6)表示原始数组的第0行第3列的值为6

{
  4   5   3
  0   3   6
  1   0   5
  1   3   9
}

代码示例:

public class SparseArray {

    public static void main(String[] args) throws IOException {
        //1、创建一个二维数组
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1 ;
        chessArr1[2][3] = 2 ;
        System.out.println("原始二维数组:");
        //记录非0的个数
        int sum = 0;
        for (int[] rows : chessArr1){
            for (int data : rows){
                System.out.printf("%2d ",data);
                if (data!=0)
                    sum++;
            }
            System.out.println();
        }

        //2、将二维数组转为稀疏数组
        //为稀疏数组赋值
        //赋值第0行
        int[][] sparseArr = new int[sum+1][3];
        sparseArr[0][0] = chessArr1.length;
        sparseArr[0][1] = chessArr1[0].length;
        sparseArr[0][2] = sum;
        //赋值其他行
        int count = 0;
        for (int i=0; i<chessArr1.length ; i++){
            for (int j=0; j<chessArr1[i].length;j++){
                if (chessArr1[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];

                }
            }
        }
        System.out.println("转换为的稀疏数组为:");
        printArray(sparseArr);

        //3、将稀疏数组转为二维数组
        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];
        }
        System.out.println("转换后的二维数组为:");
        printArray(chessArr2);


//        saveArray(sparseArr,new File("array.csv"));
//        int[][] readArray = readArray(new File("array.csv"));
//        System.out.println("读取文件的稀疏列表:");
//        for (int[] line : readArray){
//            for (int data : line){
//                System.out.printf("%3d ",data);
//            }
//            System.out.println();
//        }
    }

    public static void saveArray(int[][] arr,File file) throws IOException {
        String path = SparseArray.class.getResource("").getPath().substring(1);
        File saveFile = new File(path+"\"+file.getName());
        if (!saveFile.exists()){
            if(!saveFile.createNewFile()){
                throw new RuntimeException("创建文件:"+saveFile+"失败;");
            }
        }
        //写数据
        FileWriter fw = new FileWriter(saveFile);
        for (int[] ints : arr) {
            String line = Arrays.toString(ints);
            line = line.replace(" ","");
            line = line.substring(1, line.length() - 1);
            fw.write(line + "
");
        }
        fw.close();
    }


    public static int[][] readArray(File file) throws IOException {
        String path = SparseArray.class.getResource("").getPath().substring(1);
        File readFile = new File(path+"\"+file.getName());
        if (!readFile.exists()){
           throw new RuntimeException("读取文件:"+readFile+"失败,文件不存在");
        }
        //读取数据
        BufferedReader br = new BufferedReader(new FileReader(readFile));
        //读取头信息
        String line = br.readLine();
        String[] strings = line.split(",");
        int lens = Integer.parseInt(strings[2]);
        int[][] retArray = new int[lens+1][3];
        retArray[0][0] = Integer.parseInt(strings[0]);
        retArray[0][1] = Integer.parseInt(strings[1]);
        retArray[0][2] = Integer.parseInt(strings[2]);
        //读取头以外的信息
        for(int count=1;count<=lens;count++){
            line = br.readLine();
            strings = line.split(",");
            retArray[count][0] = Integer.parseInt(strings[0]);
            retArray[count][1] = Integer.parseInt(strings[1]);
            retArray[count][2] = Integer.parseInt(strings[2]);
        }
        br.close();
        return retArray;
    }

    /**
     * 打印二维数组
     * @param array
     */
    public static void printArray(int[][] array){
        for (int[] rows : array){
            for (int data : rows){
                System.out.printf("%2d ",data);
            }
            System.out.println();
        }
    }
}

打印结果:

原始二维数组:
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  1  0  0  0  0  0  0  0  0 
 0  0  0  2  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
转换为的稀疏数组为:
11 11  2 
 1  2  1 
 2  3  2 
转换后的二维数组为:
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  1  0  0  0  0  0  0  0  0 
 0  0  0  2  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
 0  0  0  0  0  0  0  0  0  0  0 
--------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
原文地址:https://www.cnblogs.com/zjw-blog/p/13508338.html