sparseArray 稀疏数组
应用场景:用于二维数组的大小优化,当二维数组中有大量相同的值时。
---------------------------------------代码实现---------------------------------------
public static void main(String[] args) { //二维数组 int a[][] = new int[5][5]; a[1][2] = 3; a[2][4] = 5; a[3][1] = 1; for (int[] ints : a) { for (int anInt : ints) { System.out.printf("%d\t",anInt); } System.out.println(); } }
如上图一个二维数组,里面有25个元素,其中有22个0,这时就可以用稀疏数组优化存储大小。
此时计算出的稀疏数组格式应该为:
5 5 3 //行数,列数,特殊值个数
1 2 3 //第2行第3列的值为3
2 4 5 //第3行第5列的值为5
3 1 1 //第4行第2列的值为1
这样新的稀疏数组中的只有12个元素,相较之前二维数组中的25个已经明显看出区别。
---------------------------------------代码实现---------------------------------------
//得到特殊元素总数 int sum = 0; for (int[] ints : a) { for (int anInt : ints) { if(anInt != 0) sum++; } } System.out.println("特殊元素总数为:"+sum); //新建一个稀疏数组 int sparseArray[][] = new int[sum+1][3]; //第一行数据赋值 5行5列 sum个特殊元素 sparseArray[0][0] = 5; sparseArray[0][1] = 5; sparseArray[0][2] = sum; //赋值 int z = 1;//用于计算稀疏数组中的行下标 for (int i = 0;i < a.length;i++){ for (int j = 0;j < a[i].length;j++){ if(a[i][j] != 0){ //z=1表示:当检测到第1个特殊元素时,把这个元素的下标和value存到稀疏数组的第二行(由于第一行存了数组信息5行5列3个元素,所以这里存第二行) sparseArray[z][0] = i; sparseArray[z][1] = j; sparseArray[z][2] = a[i][j]; z++; } } } //打印 System.out.println("稀疏数组"); for (int[] ints : sparseArray) { for (int anInt : ints) { System.out.printf("%d\t",anInt); } System.out.println(); }
控制台输出:
接下来记录将稀疏数组再转化成二维数组
---------------------------------------代码实现---------------------------------------
//恢复成二维数组 int row = sparseArray[0][0];//得到行数 int col = sparseArray[0][1];//得到列数 int b[][] = new int[row][col];//此时得到了一个5行5列元素全是0的二维数组 //从第二行开始遍历sparseArray给新建的二维数组赋值 for (int i = 1;i < sparseArray.length;i++){ int x = sparseArray[i][0];//拿到多少行x int y = sparseArray[i][1];//拿到多少列y b[x][y] = sparseArray[i][2];//在x,y处赋值 } //打印 System.out.println("新的二维数组"); for (int[] ints : b) { for (int anInt : ints) { System.out.printf("%d\t",anInt); } System.out.println(); }
得到结果
好的一逼!