稀疏数组
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式
- 记录数组一共有几行几列,有多少个不通值
- 把具有不同值的元素与行列及值记录在一共小规模的数组中,从而缩小程序的规模
package com.xin.array;
public class ArrayDemo04 {
public static void main(String[] args) {
//1.创建一个二维数组 11*11 0;没有棋子 1:黑棋 2:白棋
int[][] array1 = new int[11][12];
array1[1][2] = 1;
array1[2][3] = 2;
array1[1][4] = 1;
//输出原始的数组
System.out.println("输出原始的数组:");
//for - each 遍历数组的简单写法 array1.for
//二维数组for两遍才能打印,第一个for是行,第二个for是列
for(int[] ints :array1){
for(int anInt : ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
//转换为稀疏数组保存
//需要先获取有效值个数
int sum = 0;
for (int i = 0; i < 11; i++) { //遍历行
for (int j = 0; j < 12; j++) { //遍历列
if(array1[i][j]!=0){ //i行j列的值不为0
sum++;
}
}
}
System.out.println("有效值的个数:="+sum);
//2.创建一个稀疏数组的数组
/* 行 列 值
11 12 3 值的总个数 (根据有多少个值创建几行加1)
。。。 ps:第一行用来存放原始数组有几行几列
3 2 2(值)
*/
int[][] array2 = new int[sum+1][3];
//给稀疏数组赋值 第一行就为原始数组的几行几列与几个有效值个数
array2[0][0] = 11;
array2[0][1] = 12;
array2[0][2] = sum;
//遍历原始二维数组,将非0的值,储存在稀疏数组中 //array1.length二维数组的长度0-i
int count = 0; //记录第几个非0的元素 // [0] → [0][12]
for (int i = 0; i < array1.length; i++) { // [i] → [0][12]
for (int j = 0; j < array1[i].length; j++) {// array[i].length 表示第i行的长度(有多少个数值) 12
if (array1[i][j]!=0){ //判断不为0的数
count++; //count++后从1开始,所以不会覆盖第[0]行我们付的值。
array2[count][0] = i ; //将 i存放在第count行 第1 列
array2[count][1] = j ; //将j存放在 第count行 第2 列
array2[count][2] = array1[i][j] ; //将原始数组中的[i],[j]对应的值存放在第count行 第3 列
}
}
}
//输出稀疏数组
System.out.println("输出稀疏数组");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"+ //输出array2第i行的[0] [1] [2]的值
array2[i][1]+"\t"+
array2[i][2]+"\t" );
}
System.out.println("===============");
System.out.println("还原");
/*
输出稀疏数组
11 12 3
1 2 1
1 4 1
2 3 2
*/
//还原 1.读取稀疏数组
int [][] array3 = new int[array2[0][0]][array2[0][1]];//长宽
//稀疏数组我们第一行放的是我们的数据 11 12 3 [0][0]对应的11 [0][1]对应的12
// 2.给元素还原值,通过坐标轴来给其中的元素赋值 ,遍历array2
for (int i = 1; i < array2.length; i++) { //这里i需要从1取是因为我们的稀疏数组的第一列没有存放坐标
array3[array2[i][0]][array2[i][1]] = array2[i][2]; //取出array2中第i行的[0] [1] [2]的值
}
//打印还原数组
for(int[] ints :array3){
for(int anInt : ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}