上面的原来的二维数组有许多的0值或者为同一个值的时候,记录了许多没有意义的数据,因此可以用稀疏数组来保存该数组,可以缩小规模
原本是6行7列的二维数组,现在变成9行3列的稀疏数组。
代码如下:
将二维数组转为稀疏数组
public class Test01 {
public static void main(String[] args) {
//首先声明一个原有的二维数组并输出
int array [][] = new int[11][11];
//0 1 2
array[1][2]=1;
array[2][3]=2;
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
System.out.print(" "+array[i][j]);
}
System.out.println();
}
//2.遍历原有数组 得出非零数字的个数
int nums=0;
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
if (array[i][j]!=0) {
nums++;
}
}
}
//输出为2
System.out.println(nums);
//3.创建稀疏数组 稀疏数组的列是固定的3列 又因为只有两个值不为零 所以有三行
int sparseArray[][] = new int[nums+1][3];
//下面是稀疏数组的第一行对应的值
sparseArray[0][0]=array.length;
sparseArray[0][1]=11;
sparseArray[0][2]=nums;
//现在需要做的是将二维数组的非零值放在稀疏数组里面
//再次遍历二维数组 当遍历的时候出现非零值 比如【2】【3】
//原来在第二行和第三列有值 那么稀疏数组的行值就是 2 列的值就是3 最后的值就是非零值
//该行有值 就是下一行 count记录第几个非零数字
int count =0;
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
if (array[i][j]!=0) {
count++;
sparseArray[count][0]=i;
sparseArray[count][1]=j;
sparseArray[count][2]=array[i][j];
}
}
}
//输出稀疏数组
for (int i=0;i<sparseArray.length;i++){
for (int j=0;j<sparseArray[i].length;j++){
System.out.print(" "+sparseArray[i][j]);
}
System.out.println();
}
}
}
输出结果:
稀疏数组转化为原有的二维数组:
结果如下:
课后练习题:
1.将稀疏数组保存在磁盘上,比如map.data
2.再从磁盘上把稀疏数组读出来转化成原数组
代码:
package com.zy;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test02 {
public static void main(String[] args) throws IOException {
System.out.println("原有的二维数组如下:");
//首先声明一个原有的二维数组并输出
int array [][] = new int[11][11];
//0 1 2
array[1][2]=1;
array[2][3]=2;
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
System.out.print(" "+array[i][j]);
}
System.out.println();
}
System.out.println("原有数组非零值如下:");
//2.遍历原有数组 得出非零数字的个数
int nums=0;
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
if (array[i][j]!=0) {
nums++;
}
}
}
//输出为2
System.out.println(nums);
System.out.println("原有的二维数组转为稀疏数组结果如下:");
//3.创建稀疏数组 稀疏数组的列是固定的3列 又因为只有两个值不为零 所以有三行
int sparseArray[][] = new int[nums+1][3];
//下面是稀疏数组的第一行对应的值
sparseArray[0][0]=array.length;
sparseArray[0][1]=11;
sparseArray[0][2]=nums;
//现在需要做的是将二维数组的非零值放在稀疏数组里面
//再次遍历二维数组 当遍历的时候出现非零值 比如【2】【3】
//原来在第二行和第三列有值 那么稀疏数组的行值就是 2 列的值就是3 最后的值就是非零值
//该行有值 就是下一行 count记录第几个非零数字
int count =0;
for (int i=0;i<array.length;i++){
for (int j=0;j<array[i].length;j++){
if (array[i][j]!=0) {
count++;
sparseArray[count][0]=i;
sparseArray[count][1]=j;
sparseArray[count][2]=array[i][j];
}
}
}
//输出稀疏数组
for (int i=0;i<sparseArray.length;i++){
for (int j=0;j<sparseArray[i].length;j++){
System.out.print(" "+sparseArray[i][j]);
}
System.out.println();
}
FileWriter fw = new FileWriter("D:\\map.data");
for (int[] row : sparseArray){
for (int data : row ){
fw.write(data);
}
}
fw.close();
// 3. 从map.data中读取该稀疏数组
// 3.1 先造个稀疏数组
int[][] mapSparseArray2 = new int[nums+1][3];
// 3.2 将map.data中数据读入mapSparseArray2中
FileReader fr = new FileReader("D:\\map.data");
for (int i = 0; i < nums+1; i++){
for (int j = 0; j < 3; j++){
int num = fr.read();
mapSparseArray2[i][j] = num;
}
}
fr.close();
System.out.println("稀疏数组转化为原有的二维数组");
//1.首先 稀疏数组的【0】【0】和【0】【1】是原有数组的行和列的个数
int array2[][] = new int[mapSparseArray2[0][0]][mapSparseArray2[0][1]];
//2.稀疏数组里面的值都是有值的,没有0值 现在对二维数组进行赋值
//因为第一行定义的是原有数组的行数和列数 所以值从第二行开始 也就是1 int i=1开始;
for (int i=1;i<mapSparseArray2.length;i++){
array2[mapSparseArray2[i][0]][mapSparseArray2[i][1]]=mapSparseArray2[i][2];
}
//输出恢复后的二维数组
for (int i=0;i<array2.length;i++){
for (int j=0;j<array2[i].length;j++){
System.out.print(" "+array2[i][j]);
}
System.out.println();
}
}
}