我们在了解稀疏数组之前先来看一个实际的需求
上图中要记录棋盘的数据,可以用二维数组来记录,但是有很多没有意义的数据,所以可以使用稀疏数组来记录
处理方法:
1.记录二维数组一共有几行几列,有多少个不同的值
2.把具有不值得元素行列及值记录在一个小规模的数组中,从而缩小程序的规模
编程思路
将二维数组转化为稀疏数组
1. 遍历原始二维数组,获取有效数据的个数num
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
System.out.printf("%d\t",chessArr[i][j]);
}
System.out.println();
}
int num=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j]!=0){
num++;
}
}
}
2. 根据num新建稀疏数组 sparseArr int[num+1][3]
//新建稀疏数组
int sparseArr [][]=new int[num+1][3];
3. 给稀疏数组第一行赋值
//给稀疏数组第一行赋值
sparseArr[0][0]=11;
sparseArr[0][1] = 11;
sparseArr[0][2] = num;
4. 将二维数组的有效数据存入稀疏数组
//给稀疏数组其他行赋值
int count=0;
for (int i=0;i<chessArr.length;i++){
for (int j=0;j<chessArr[i].length;j++){
if (chessArr[i][j]!=0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr[i][j];
}
}
}
5. 遍历稀疏数组
//输出稀疏数组
System.out.println("稀疏数组为");
for (int[] row:sparseArr){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
稀疏数组转化为原始二维数组
1. 先读取稀疏数组的第一行,创建原始二维数组
//将稀疏数组转化为原始数组
//1.读取稀疏数组的第一行创建二维数组
int x= sparseArr[0][0];
int y=sparseArr[0][1];
int chessArr2[][]=new int[x][y];
2. 从第二行开始读取稀疏数组,赋值给原始二维数组
//2.读取后面的数据赋给chessArr2
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
3.遍历原始二维数组
//遍历原始二维数组
System.out.println("新的二维数组为");
for (int[] row:chessArr2){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
完整代码
public class SparseArrayTest {
public static void main(String[] args) {
//新建二维数组
int chessArr[][]=new int[11][11];
chessArr[1][2]=1;
chessArr[2][3]=2;
System.out.println("原始二维数组为");
for (int i=0;i<11;i++){
for (int j=0;j<11;j++){
System.out.printf("%d\t",chessArr[i][j]);
}
System.out.println();
}
int num=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j]!=0){
num++;
}
}
}
//新建稀疏数组
int sparseArr [][]=new int[num+1][3];
//给稀疏数组第一行赋值
sparseArr[0][0]=11;
sparseArr[0][1] = 11;
sparseArr[0][2] = num;
//给稀疏数组其他行赋值
int count=0;
for (int i=0;i<chessArr.length;i++){
for (int j=0;j<chessArr[i].length;j++){
if (chessArr[i][j]!=0){
count++;
sparseArr[count][0]=i;
sparseArr[count][1]=j;
sparseArr[count][2]=chessArr[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组为");
for (int[] row:sparseArr){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
//将稀疏数组转化为原始数组
//1.读取稀疏数组的第一行创建二维数组
int x= sparseArr[0][0];
int y=sparseArr[0][1];
int chessArr2[][]=new int[x][y];
//2.读取后面的数据赋给chessArr2
for (int i = 1; i < sparseArr.length; i++) {
chessArr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
//遍历原始二维数组
System.out.println("新的二维数组为");
for (int[] row:chessArr2){
for (int data:row){
System.out.printf("%d\t",data);
}
System.out.println();
}
}
}