稀疏数组
当一个数组中大部分元素是0的时候,或者为同一个值的数组的时候,可以用稀疏数组来保存改数组。
稀疏数组的处理方式:
- 记录数组有几行几列。有多少个不同值。
- 把具有不同值的元素和行列以及值记录在 一个小规模的数组中,从而缩小程序的规模
下图左边为普通数组,右边为稀疏数组
普通数组转化为稀疏数组
再将稀疏数组转换成普通数组
代码:
package com.base1.array;
public class xishuArrsyDemo1 {
public static void main(String[] args) {
//创建一个二维数组 11*11 0为无棋子 1为黑 2为白
int[][] a=new int[11][11];
a[1][2]=1;
a[2][3]=1;
//输出普通的数组
System.out.println("输出原数组:");
for (int[] ints : a) {
for (int aint : ints) {
System.out.print(aint+"\t");
}
System.out.print('\n');
}
//转化为稀疏数组保存
//获取有效值的个数
int sum=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (a[i][j] != 0) {
System.out.print("第"+i+"行,");
System.out.print("第"+j+"列的数为:");
System.out.println(a[i][j]);
sum++;
}
}
}
System.out.println("有效值个数为:"+sum);
System.out.println("==============");
//创建稀疏数组
int[][] x=new int[sum+1][3];
x[0][0]=11;
x[0][1]=11;
x[0][2]=sum;
//给稀疏数组赋值
int count=0;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if (a[i][j] != 0) {
//每遇到一个非0的数 count加一 稀疏数组进入下一行
//稀疏数组 每一行记录的 一个非0数位于原数组的行,列数以及概数的值
count++;
x[count][0]=i;
x[count][1]=j;
x[count][2]=a[i][j];
}
}
}
//输出稀疏数组
System.out.println("输出稀疏数组:");
for (int[] intsx : x) {
for (int aintx : intsx) {
System.out.print(aintx+"\t");
}
System.out.print('\n');
}
System.out.println("================");
//还原稀疏数组为原数组
//读取稀疏数组
//稀疏数组的第一行第一列为 原数组的行。第一行第二列为原数组的列
int[][] a2=new int[x[0][0]][x[0][1]];
//先给还原的数组全部赋值为0
for (int i = 0; i <a2.length ; i++) {
for (int j = 0; j <a2[i].length ; j++) {
a2[i][j]=0;
}
}
int hhh1=0;
int lll1=0;
int zzz1=0;
//注意下面的i要从1开始 因为稀疏数组第一行保存的是原数组的行列数 并非有效值
for (int i = 1; i <x.length ; i++) {
//取出有效值的行, 列, 值。
hhh1=x[i][0];
lll1=x[i][1];
zzz1=x[i][2];
//将有效值赋给还原数组的原来的位置
a2[hhh1][lll1]=zzz1;
}
System.out.println("输出还原数组:");
for (int[] intsa2 : a2) {
for (int ainta2 : intsa2) {
System.out.print(ainta2+"\t");
}
System.out.print('\n');
}
}
}
结果:
"D:\Program Files (x86)\jdk13\bin\java.exe" --enable-preview "-javaagent:D:\IDEA\IntelliJ IDEA Community Edition 2020.1.3\lib\idea_rt.jar=59825:D:\IDEA\IntelliJ IDEA Community Edition 2020.1.3\bin" -Dfile.encoding=UTF-8 -classpath D:\IDEA\JavaSE\out\production\基础语法 com.base1.array.xishuArrsyDemo1
输出原数组:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
第1行,第2列的数为:1
第2行,第3列的数为:1
有效值个数为:2
==============
输出稀疏数组:
11 11 2
1 2 1
2 3 1
================
输出还原数组:
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
Process finished with exit code 0