稀疏数组是一种数据结构
一个数组中的大部分元素为 0 ,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式:
如下图:左边是原始数组,右边是稀疏数组。
一个例子
分析问题:因为该二维数组的很多默认值为 0 ,因此记录了很多没有意义的数据。
解决:稀疏数组
package com.wanggenji.array; public class ArrayDemo08 { public static void main(String[] args) { //1. 创建一个二维数组11*11 0:没有棋子 1:黑棋 2:白棋 int[][] array1 = new int[11][11]; array1[1][2]=1; array1[2][3]=2; //打印原始数组 for (int[] ints : array1) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } System.out.println("=============这是分割线==========="); //打印压缩之后的数组 for (int[] ints : compress(array1)) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } System.out.println("=============这是分割线==========="); //打印解压还原之后的数组 int[][] a =compress(array1); for (int[] ints : decompressed(a)) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } } //压缩方法的实现 public static int[][] compress(int[][] array) { int count0 = 0;//零的个数 int count1 = 0;//非零元素个数 //计算值为零的元素的个数和非零元素的个数 for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { if (array[i][j]==0){ count0++; }else { count1++; } } } //创建稀疏数组 int[][] comperssedArray = new int[count1+1][3]; //稀疏数组第一行赋值 comperssedArray[0][0] = array.length; comperssedArray[0][1] = array[0].length; comperssedArray[0][2] = count0; //特殊元素保存 count1 = 1; //稀疏数组的第二行开始是特殊元素的信息 for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { if (array[i][j]!=0){ comperssedArray[count1][0] = i; comperssedArray[count1][1] = j; comperssedArray[count1][2] = array[i][j]; count1++; //换行存下一个特殊元素信息 } } } return comperssedArray; } //解压方法的实现 稀疏数组转化为 普通二维数组 public static int[][] decompressed(int[][] array) { int[][] decompressedArray = new int[array[0][0]][array[0][1]]; //稀疏数组第一行储存的数据:行 列 重复数据个数,由此创建成原来的数组 //原数组特殊数据还原 for (int i = 1; i < array.length; i++) { decompressedArray[array[i][0]][array[i][1]] = array[i][2]; } return decompressedArray; } }