作者:营营420_769 | 来源:互联网 | 2023-09-25 16:07
稀疏数组
问题引入
基本介绍
- 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
- 稀疏数组的处理方法是:
- 1.记录数组一共有几行几列,有多少个不同的值
- 2.把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
实例应用
- 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
- 把稀疏数组存盘,并且可以从新恢复原来的二维数组
- 数整体思路分析
实现代码
package com.atguigu.sparsearray;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class SparseArray {public static void main(String[] args) {SparseArray sparse &#61; new SparseArray();int chessArr1[][] &#61; new int[11][11];chessArr1[1][2] &#61; 1;chessArr1[2][3] &#61; 2;System.out.println("原始的二维数组~");for (int[] row : chessArr1) {for (int data : row) {System.out.print(data &#43; "\t");}System.out.println();}int sum &#61; 0;for (int i &#61; 0; i < 11; i&#43;&#43;) {for (int j &#61; 0; j < 11; j&#43;&#43;) {if (chessArr1[i][j] !&#61; 0) {sum&#43;&#43;;}}}int sparseArr[][] &#61; new int[sum &#43; 1][3];sparseArr[0][0] &#61; 11; sparseArr[0][1] &#61; 11;sparseArr[0][2] &#61; sum;int count &#61; 0; for (int i &#61; 0; i < 11; i&#43;&#43;) {for (int j &#61; 0; j < 11; j&#43;&#43;) {if (chessArr1[i][j] !&#61; 0) { count&#43;&#43;;sparseArr[count][0] &#61; i;sparseArr[count][1] &#61; j;sparseArr[count][2] &#61; chessArr1[i][j];}}}System.out.println();System.out.println("得到的稀疏数组为&#xff1a;");for (int i &#61; 0; i < sparseArr.length; i&#43;&#43;) {for (int j &#61; 0; j < sparseArr[i].length; j&#43;&#43;) {System.out.print(sparseArr[i][j] &#43; "\t");}System.out.println();}System.out.println("稀疏数组打印完毕...");System.out.println("****************将稀疏数组存放到磁盘中****************************");String fileWritePath&#61;"E:\\B站Java学习资料存放\\算法与数据结构\\笔记代码课件资料\\课件\\emp.data";sparse.writeSparseArray(fileWritePath, sparseArr);System.out.println("******************稀疏数组存到磁盘中完毕*************************");int[][] readSparseArray &#61; sparse.readSparseArray(fileWritePath);int chessArr2[][] &#61; new int[readSparseArray[0][0]][sparseArr[0][1]];for (int i &#61; 1; i < sparseArr.length; i&#43;&#43;) {int j &#61; 0;chessArr2[sparseArr[i][j]][sparseArr[i][j &#43; 1]] &#61; sparseArr[i][j &#43; 2];}System.out.println();System.out.println("恢复后的二维数组");for (int[] data1 : chessArr2) {for (int data : data1) {System.out.printf("%d\t", data);}System.out.println();}}public boolean writeSparseArray(String fileWritePath,int[][] sparseArr ){FileWriter fw &#61; null;try {File file &#61; new File(fileWritePath);if (!(file.exists())) {System.out.println("文件不存在创建中...");file.createNewFile();System.out.println("文件创建成功");}fw &#61; new FileWriter(file);for (int i &#61; 0; i < sparseArr.length; i&#43;&#43;) {
for(int j &#61; 0 ; j < sparseArr[i].length; j&#43;&#43;){fw.write(sparseArr[i][j] &#43; "\t"); }fw.write("\r\n");}} catch (Exception e) {e.printStackTrace();return false;} finally {try {fw.close();} catch (IOException e) {e.printStackTrace();return false;}}return true;}public int[][] readSparseArray(String readFilePath){BufferedReader br &#61; null;int[][] sparseArray &#61; null;try {br &#61; new BufferedReader(new FileReader(new File(readFilePath)));boolean isNotRead &#61; false;String str;int curCount &#61; 0;int len;while ((str &#61; br.readLine()) !&#61; null) {String[] split &#61; str.split("\t");if (!isNotRead) {sparseArray &#61; new int[Integer.parseInt(split[2]) &#43; 1][3];sparseArray[curCount][0] &#61; Integer.parseInt(split[0]);sparseArray[curCount][1] &#61; Integer.parseInt(split[1]);sparseArray[curCount][2] &#61; Integer.parseInt(split[2]);curCount&#43;&#43;;isNotRead &#61; true;} else {sparseArray[curCount][0] &#61; Integer.parseInt(split[0]);sparseArray[curCount][1] &#61; Integer.parseInt(split[1]);sparseArray[curCount][2] &#61; Integer.parseInt(split[2]);curCount&#43;&#43;;}}System.out.println("**********成功写出*************");} catch (IOException e) {e.printStackTrace();} finally {if (br !&#61; null) {try {br.close();} catch (IOException e) {e.printStackTrace();}}}return sparseArray;}}