java数据结构与算法-1.1稀疏数组
稀疏sparsearray数组
先看一个实际的需求: 编写的五子棋程序中,有存盘退出和续上盘的功能。
分析问题:
因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组。
稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
记录数组一共有几行几列,有多少个不同的值
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
应用实例
- 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
- 把稀疏数组存盘,并且可以从新恢复原来的二维数组数
- 整体思路分析
4. 代码实现
/** * 功能描述: 稀疏数组-相关练习 * * @author lunaw- * @version 1.0 * @date 2023/12/7 21:07 */ public class SparseArrayDemo { public static void main(String[] args) { //以五子棋程序为例,定义一个普通二维数组 int[][] commonArray = new int[11][11]; commonArray[1][2] = 1; commonArray[2][3] = 2; //首先打印出原始数组 System.out.println("---------------------------打印原始二维数组:---------------------------"); for (int[] array : commonArray) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + "\t"); } System.out.println(); } /** * 二维数组转稀疏数组 */ //先计算出二维数组的有效数据个数 int size = 0; for (int[] array : commonArray) { for (int i = 0; i < array.length; i++) { if (array[i] != 0) { size++; } } } //定义一个稀疏数组 int[][] sparseArray = new int[size + 1][3]; sparseArray[0][0] = commonArray.length; sparseArray[0][1] = commonArray[0].length; sparseArray[0][2] = size; int count = 0; for (int i = 0; i < commonArray.length; i++) { for (int j = 0; j < commonArray[i].length; j++) { if (commonArray[i][j] != 0) { count++; sparseArray[count][0] = i; sparseArray[count][1] = j; sparseArray[count][2] = commonArray[i][j]; } } } System.out.println("---------------------------打印转换后的稀疏数组:---------------------------"); for (int[] array : sparseArray) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + "\t"); } System.out.println(); } /** * 稀疏数组转二维数组 */ int[][] mySparseArray = new int[3][3]; mySparseArray[0][0] = 11; mySparseArray[0][1] = 11; mySparseArray[0][2] = 2; mySparseArray[1][0] = 1; mySparseArray[1][1] = 2; mySparseArray[1][2] = 1; mySparseArray[2][0] = 2; mySparseArray[2][1] = 3; mySparseArray[2][2] = 2; int[][] myArray = new int[mySparseArray[0][0]][mySparseArray[0][1]]; for (int i = 1; i < mySparseArray.length; i++) { myArray[mySparseArray[i][0]][mySparseArray[i][1]] = mySparseArray[i][2]; } System.out.println("---------------------------打印转换回来的普通二维数组:---------------------------"); for (int[] array : myArray) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + "\t"); } System.out.println(); } } }
课后练习
- 在前面的基础上,将稀疏数组保存到磁盘上,比如 map.data
- 恢复原来的数组时,读取map.data 进行恢复
/** * 功能描述: 稀疏数组-相关练习 * * @author lunaw- * @version 1.0 * @date 2023/12/7 21:07 */ public class SparseArrayDemo { public static void main(String[] args) { int[][] sparseArray = new int[3][3]; sparseArray [0][0] = 11; sparseArray [0][1] = 11; sparseArray [0][2] = 2; sparseArray [1][0] = 1; sparseArray [1][1] = 2; sparseArray [1][2] = 1; sparseArray [2][0] = 2; sparseArray [2][1] = 3; sparseArray [2][2] = 2; int[][] newSparseArray = new int[3][3]; //写入map.data writeToFile(sparseArray, "D:\\workspace_java\\Helloworld\\src\\main\\resources\\map.data"); //读取二维数组 readFile(newSparseArray, "D:\\workspace_java\\Helloworld\\src\\main\\resources\\map.data"); System.out.println("---------------------------打印从磁盘上读取的稀疏数组:---------------------------"); for (int[] array : newSparseArray) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + "\t"); } System.out.println(); } } /** * 将稀疏数组写入到指定文件夹 * * @param sparseArray 稀疏数组 * @param fileName 文件位置 */ public static void writeToFile(int[][] sparseArray, String fileName) { File file = new File(fileName); FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(file); bufferedWriter = new BufferedWriter(fileWriter); for (int i = 0; i < sparseArray.length; i++) { bufferedWriter.write(Arrays.toString(sparseArray[i]).replace("[", "").replace("]", "")); bufferedWriter.newLine(); } } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedWriter != null) { try { bufferedWriter.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 将稀疏数组从磁盘中读出 * * @param sparseArray 稀疏数组 * @param fileName 文件位置 * @return 稀疏数组 */ public static int[][] readFile(int sparseArray[][], String fileName) { File file = new File(fileName); FileReader fileReader = null; BufferedReader bufferedReader = null; try { fileReader = new FileReader(file); bufferedReader = new BufferedReader(fileReader); String line = null; int row = 0; while ((line = bufferedReader.readLine()) != null) { String[] split = line.split(","); for (int i = 0; i < split.length; i++) { sparseArray[row][i] = Integer.parseInt(split[i].trim()); } row++; } } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedReader != null) { try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sparseArray; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!