稀疏数组
概念
- 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
- 稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
- 如下图:左边是原始数组,右边是稀疏数组
代码:
package com.zhen.ArrayDemo;
public class ArrayDemo01 {
public static void main(String[] args) {
//原数组
int[][] array1 =new int[11][11];
array1[1][1] = 1 ;
array1[2][2] = 2 ;
System.out.println("输出原数组为:");
//增强for循环,遍历原数组
for (int[] ints: array1){
for (int anInt: ints){
System.out.print(anInt + "\t");
}
System.out.println();
}
System.out.println("==================================");
// 转换为稀疏数组保存
// 获取有效的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j] != 0) {
// 获取有效个数
sum++;
}
}
}
System.out.println("有效个数为:" + sum);
// 创建一个稀疏数组
int[][] array2 = new int[sum+1][3];
//稀疏数组的头部信息
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
// 遍历二维数组,将非零的值,存放到稀疏数组中
int count=0;
// array1.length 表示二维数组array1 行的长度 ,数组的行数
for (int i = 0; i < array1.length; i++) {
// array1[i].length第i行的长度,列数
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
System.out.println("稀疏数组:");
//遍历稀疏数组
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"+
array2[i][1]+"\t"+
array2[i][2]+"\t");
}
System.out.println("==================================");
System.out.println("还原");
//· 1.读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//2.给其中的元素还原它的值
// 从稀疏数组第二行开始为有效值,所以i从1开始
for (int i = 1; i < array2.length; i++) {
//array3[[array2行][array2列]] = array2[值]
array3[array2[i][0]][array2[i][1]] =array2[i][2];
}
System.out.println("输出原数组为:");
//增强for循环,遍历出原数组
for (int[] ints: array3){
for (int anInt: ints){
System.out.print(anInt + "\t");
}
System.out.println();
}
}
}
结果:
输出原数组为:
0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0
0 0 2 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有效个数为:2
稀疏数组:
11 11 2
1 1 12 2 2
还原
输出原数组为:
0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0
0 0 2 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 0
注意:
array1.length 表示二维数组 array1 行的长度 ,数组的行数
array1[i].length 表示第 i 行的长度, 即列数