SparseArray(稀疏数组)


稀疏数组,作为压缩普通数组的一种方式
import java.util.Arrays;

/**
 *  1、原数组的行数,列数,非0数据个个数
 *  2、所有非0数据个坐标(row,column)
 */
public class SparseArray {

    public static int[][] toSparseArray(int[][] array) {
        // 找到所有非0的数据个数
        int valueCount = 0;
        for (int i = 0 ;i < array.length; i ++) {
            for(int j = 0 ;j < array[i].length; j ++) {
                int value = array[i][j];
                if (value != 0) {
                    valueCount++;
                }
            }
        }

        // 初始化稀疏素组第一行数据,记录原始数组的 row/column/valueCount
        int[][] sparseArray = new int[valueCount + 1][3];
        sparseArray[0][0] = array.length;
        sparseArray[0][1] = array[0].length;
        sparseArray[0][2] = valueCount;

        // 稀疏素组所有非0数据的坐标
        int index = 0;
        for (int i = 0 ;i < array.length; i ++) {
            for(int j = 0 ;j < array[i].length; j ++) {
                int value = array[i][j];
                if (value != 0) {
                    index++;
                    sparseArray[index][0] = i;
                    sparseArray[index][1] = j;
                    sparseArray[index][2] = value;
                }
            }
        }
        return  sparseArray;
    }

    public static int[][] toArray(int[][] sparseArray) {
        //根据第一行数据,初始化原始数组的
        int[][] array = new int[sparseArray[0][0]][sparseArray[0][1]];
        // 赋值
        for (int i = 1 ; i < sparseArray.length; i ++) {
            int row = sparseArray[i][0];
            int column = sparseArray[i][1];
            int value = sparseArray[i][2];
            array[row][column] = value;
        }
        return  array;
    }

    public static void main(String[] args) {
        int originalArray[][] = new int [7][8];
        originalArray[0][1] = 8;
        originalArray[1][2] = 9;
        toString(originalArray);

        int[][] sparseArray = toSparseArray(originalArray);
        toString(sparseArray);

        int[][] array = toArray(sparseArray);
        toString(array);
    }

    private static void toString(int[][] array) {
        for (int i = 0 ;i < array.length; i ++) {
            System.out.println(Arrays.toString(array[i]));
        }
    }
}

相关