Java实现稀疏数组以及将稀疏数组存储到硬盘和从硬盘种读取操作

  • Java实现稀疏数组
  • 原二维数组—>稀疏数组
  • 稀疏数组—>原二维数组
  • 将稀疏数组保存到硬盘中
  • 将稀疏数组读入内存
  • 为了扩展思维,练习编程,所以写法不一
  • 从上到下看就好,没有对函数进行封装
package zc;
/**
 * Java实现稀疏数组
 * 原二维数组--->稀疏数组
 * 稀疏数组--->原二维数组
 * 将稀疏数组保存到硬盘中
 * 将稀疏数组读入内存
 * 为了扩展思维,练习编程,所以写法不一
 * 从上到下看就好,没有对函数进行封装
 * @param args
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class SparseArray {
	public static void main(String[] args) {
		//创建一个系数数组
		int[][] arr=new int[11][11];
		arr[0][0]=1;
		arr[1][1]=2;
		arr[5][6]=3;
		//输出二维数组
		System.out.println("-----------------二维数组----------------------------");
	
		for(int[] row:arr) {
			for(int data:row) {
				System.out.print(data+"\t");
			}
			System.out.println();
		}
		
		//二维数组转稀疏数组
		int sum=0;
		for(int[] row:arr) {
			for(int data:row) {
				sum=data!=0?sum+1:sum;  //三元运算符
			}
		}
		System.out.println(sum);  //输出不为零的个数
		
		//创建稀疏数组
		int sparseArr[][]=new int[sum+1][3];
		sparseArr[0][0]=arr.length;   //原二维数组的行数
		sparseArr[0][1]=arr[0].length;  //原二维数组的列数
		sparseArr[0][2]=sum;
		
		//遍历二维数组,将不为0的数放入稀疏数组中
		int count=0;
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[0].length;j++) {
				if(arr[i][j]!=0) {
					sparseArr[++count][0]=i;
					sparseArr[count][1]=j;
					sparseArr[count][2]=arr[i][j];
				}
			}
		}
		
		//打印稀疏数组
		System.out.println("-----------------稀疏数组---------------------------");
		for(int[] row:sparseArr) {
			for(int data:row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
		//稀疏数组还原成原二维数组
		int [][] arr2;
		arr2=new int[sparseArr[0][0]][sparseArr[0][1]];
		//读取稀疏数组的数据,将其赋值给二维数组
		for(int i=1;i<sparseArr.length;i++) {
				arr2[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
		}
		
		//打印还原后的二维数组
		System.out.println("-----------------还原后二维数组-------------------");
		for(int[] row:arr2) {
			for(int data:row) {
				System.out.print(data+"\t");
			}
			System.out.println();
		}
		
		//将稀疏数组保存到硬盘上
		File dest=new File("sparesArray.data");
		
		try (BufferedWriter bw=new BufferedWriter(new FileWriter(dest));){
			for(int[] row:sparseArr) {
				for(int data:row) {
					bw.write(data+"\t");
				}
				bw.write("\n");
				bw.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//从硬盘读取稀疏数组,并进行恢复
		//获取硬盘中稀疏数组的行数,并将其存储到一个list中
		File src=new File("sparesArray.data");
		BufferedReader br=null;
		List<Integer> list=new ArrayList<>();
		try {
			br=new BufferedReader(new FileReader(src));
			String line;
			while((line=br.readLine())!=null) {
				   String[] str=line.split("\t");
				   for(int i=0;i<str.length;i++) {
					   list.add(Integer.parseInt(str[i]));
				   }
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(br!=null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		//打印稀疏数组行数
		System.out.println("稀疏数组的行数为:  "+list.get(2)+1);   //第三个元素代表不为0的元素有多少个,+1代表稀疏数组的行数
		
		
		//从硬盘读取稀疏数组到内存种的方法一:由于还要进行读硬盘操作,效率较低
		//创建稀疏数组
		/*int sparseArr2[][]=new int[list.get(2)+1][3];
		File src2=new File("sparesArray.data");
		BufferedReader br2=null;
		List<Integer> list2=new ArrayList<>();
		int row=0;
		try {
			br=new BufferedReader(new FileReader(src));
			String line;
			while((line=br.readLine())!=null) {
				   String[] str=line.split("\t");
				   for(int i=0;i<str.length;i++) {
					   sparseArr2[row][i]=(Integer.parseInt(str[i]));
				   }
				   row++;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(br!=null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		//打印稀疏数组
		System.out.println("-----------------稀疏数组---------------------------");
		for(int[] row2:sparseArr2) {
			for(int data:row2) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}*/ 
		
		
		//从硬盘读取稀疏数组到内存种的方法二:直接对之前的list进行操作
		//创建稀疏数组
		int sparseArr2[][]=new int[list.get(2)+1][3];
		int j=0;
		for(int i=0;i<list.size();i=i+3) {
			sparseArr2[j][0]=list.get(i);
			sparseArr2[j][1]=list.get(i+1);
			sparseArr2[j][2]=list.get(i+2);
			j++;
		}
		
		System.out.println("-----------------从硬盘种读取的稀疏数组---------------------------");
		for(int[] row2:sparseArr2) {
			for(int data:row2) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}
}


  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java 中,可以使用对象序列化将稀疏数组保存到磁盘上,并在需要时从磁盘上恢复。 以下是一个简单的示例代码,可以将稀疏数组保存到磁盘上,并从磁盘上恢复: ```java import java.io.*; public class SparseArray implements Serializable { private int[][] arr; private int rows; private int cols; public SparseArray(int[][] arr) { this.arr = arr; this.rows = arr.length; this.cols = arr[0].length; } public void saveToFile(String filePath) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath)); oos.writeObject(this); oos.close(); } public static SparseArray loadFromFile(String filePath) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath)); SparseArray sparseArray = (SparseArray) ois.readObject(); ois.close(); return sparseArray; } public static void main(String[] args) throws IOException, ClassNotFoundException { int[][] arr = {{0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}}; SparseArray sparseArray = new SparseArray(arr); sparseArray.saveToFile("sparse_array.bin"); SparseArray loadedSparseArray = SparseArray.loadFromFile("sparse_array.bin"); System.out.println(loadedSparseArray.rows); // 输出:5 System.out.println(loadedSparseArray.cols); // 输出:5 System.out.println(loadedSparseArray.arr[2][2]); // 输出:1 } } ``` 在上述代码中,我们定义了一个 `SparseArray` 类来表示稀疏数组,使用了 Java 内置的序列化机制来将稀疏数组保存到磁盘上,并从磁盘上恢复。在 `saveToFile` 方法中,我们使用 `ObjectOutputStream` 将对象序列化并写入到文件中;在 `loadFromFile` 方法中,我们使用 `ObjectInputStream` 从文件中读取序列化后的对象并反序列化成稀疏数组对象。在 `main` 方法中,我们演示了将稀疏数组保存到磁盘上,并从磁盘上恢复的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值