稀疏数组
当一个数组中大部分元素为0或者同一值时,可以用稀疏数组来保存该数组、
处理方式
- 记录数组一共有几行几列,有多少个不同值
- 把具有不同值的元素和行列和值记录在一个小规模数组中,缩小程序的规模
创建一个新数组用来储存不同的值和他对应的位置
如数组a[][]
0 | 0 | 0 | 0 |
---|---|---|---|
0 | 0 | 4 | 0 |
0 | 6 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 7 | 0 |
8 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
其中的 6、7、8、4
就可以通过创建一个新的数组a1[]
来存放数据
如
7(共7行) | 4(共4列) | 4(共4个值) |
---|---|---|
1 | 2 | 4 |
2 | 1 | 6 |
4 | 2 | 7 |
5 | 0 | 8 |
代码
package text1;
import java.util.Scanner;
public class text1 {
public static void main(String[] args) {
int[][] a=new int[7][4];//创建一个7行4列的数组a
a[1][2]=4;//分别将值赋值到数组的对应位置
a[2][1]=6;
a[4][2]=7;
a[5][0]=8;
System.out.println("初始数组为:");
for (int[] ints:a) {
for (int ints1:ints) {
System.out.print(ints1+"\t");
}
System.out.println();
}//输出原始数组
int a1 = 0;//计数用整数型变量a1
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 4; j++) {
if (a[i][j]!=0){
a1++;
}
}
}//寻找有效值的个数
System.out.println("有效值共:"+a1+"个");
System.out.println("稀疏数组为:");
int b[][] = new int[a1+1][3];//创建一个新数组,以有效个数+1为行数,共3列
b[0][0]=7;//行
b[0][1]=4;//列
b[0][2]=a1;//个数
int a2=0;//计数
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if (a[i][j]!=0){
a2++;
b[a2][0]=i;
b[a2][1]=j;
b[a2][2]=a[i][j];
}
}
}//将数组a中非0值的位置和数值复制给洗漱数组
for (int i = 0; i < b.length; i++) {
System.out.println(b[i][0]+"\t"+b[i][1]+"\t"+b[i][2]+"\t");
}//输出稀疏数组
System.out.println();
System.out.println("还原稀疏数组:");
int[][] a3=new int[b[0][0]][b[0][1]];//数组a的长和宽前面赋值给了b的第一行的两个数
for (int i = 1; i < b.length; i++) {//数组b的第一行为行数、列数、个数,从第二行开始索引
a3[b[i][0]][b[i][1]]=b[i][2];//数组a中的非0数值的值前面赋值给了b的第三列
}
for (int[] ints:a3) {
for (int ints1:ints) {
System.out.print(ints1+"\t");
}
System.out.println();
}
}
}
运行结果
初始数组为:
0 0 0 0
0 0 4 0
0 6 0 0
0 0 0 0
0 0 7 0
8 0 0 0
0 0 0 0
有效值共:4个
稀疏数组为:
7 4 4
1 2 4
2 1 6
4 2 7
5 0 8
还原稀疏数组:
0 0 0 0
0 0 4 0
0 6 0 0
0 0 0 0
0 0 7 0
8 0 0 0
0 0 0 0