综合运用IO、二维数组知识实现稀疏数组,能够存入磁盘及从磁盘读取,并还原为原始二维数组 - 基础就是建造高楼大厦的沙砾

用java实现文件中数据的读取并存储到二维数组中 package com.yp.algorithm; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Readfile2 { public static void... 阅读详情

稀疏数组的基本介绍

当一个数组中大部分元素为0,或者为同一个值得情况时,可以使用稀疏数组来保存该数组。

稀疏数组的预览:

在这里插入图片描述
大体可以的到一个结论,在一个二维数组中,如果相同值占2/3以上时,利用稀疏数组能节约大量空间。

整体代码如下

由于稀疏数组作为数据结构中较简单的,因此在一个类中即可实现

/*
    稀疏数组的实现:

    疑问:fori 和 foreach 哪个效率更高?答案:两者对程序的影响很小。程序的效率主要看程序设计。
 */

import java.io.*;

public class SparseArray {
    //将稀疏数组存入磁盘
    public static void saveToFile(int[][] sparseArray) throws IOException {
        File file = new File("e:/sparseArray.data");
        FileWriter fileWriter = null;
        fileWriter = new FileWriter(file);
        for (int i = 0; i < sparseArray.length; i++) {
            fileWriter.write(sparseArray[i][0] + "\t" +
                    sparseArray[i][1] + "\t" + sparseArray[i][2]);
            fileWriter.write(System.getProperty("line.separator"));// 获取当前系统换行所需要的符号 \r、\n、\r\n
        }
        fileWriter.close();
    }
    //读取磁盘中的稀疏数组
    public static int[][] readFromFile() throws IOException {
        int[][] sparseArray = null;
        File file = new File("e:/sparseArray.data");
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = null;
        bufferedReader = new BufferedReader(fileReader);
        String readLine = null;
        int cur = 0;
        while ((readLine = bufferedReader.readLine()) != null) {
            String[] tempStr = readLine.split("\t");
            if (sparseArray == null) {// 如果稀疏数组还没创建就创建
                sparseArray = new int[Integer.parseInt(tempStr[2]) + 1][3];// 创建稀疏数组
            }
            sparseArray[cur][0] = Integer.parseInt(tempStr[0]);
            sparseArray[cur][1] = Integer.parseInt(tempStr[1]);
            sparseArray[cur][2] = Integer.parseInt(tempStr[2]);
            cur++;
        }
        bufferedReader.close();//不论是读取还是写入都需要关闭流
        return sparseArray;
    }

    public static void main(String[] args) throws IOException {// 因为在saveToFile中抛出了异常
        int row = 11;
        int column = 11;
        //创建一个原始二维数组
        int[][] sourceArray1 = new int[row][column];
        sourceArray1[1][2] = 1;
        sourceArray1[2][3] = 2;
        sourceArray1[4][5] = 3;
        //输出原始数组
        System.out.println("----------原二维数组如下-----------");
        for (int[] array : sourceArray1) {
            for (int data : array) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }
        //将二维数组 转换为 稀疏数组
        //1. 遍历原始数组,得到非0数据的个数
        int count = 0;
        for (int[] array :
                sourceArray1) {
            for (int data :
                    array) {
                if (data > 0)
                    count++;
            }
        }
        //2. 创建对应的稀疏数组
        int[][] sparseArray = new int[count + 1][3];
        sparseArray[0][0] = sourceArray1.length;// [0][0]存储原始数组的行数
        sparseArray[0][1] = sourceArray1[0].length;// [0][1]存储原始数组的列数
        sparseArray[0][2] = count;// [0][2]存储原始数组中非0数据的个数
        //3. 遍历原始数组,将非0数据存储到稀疏数组中
        int cur = 0;
        for (int i = 0; i < sourceArray1.length; i++) { //用fori的原因是需要用到原始数组中的坐标值
            for (int j = 0; j < sourceArray1[0].length; j++) {
                if (sourceArray1[i][j] != 0) {
                    cur++;
                    sparseArray[cur][0] = i;
                    sparseArray[cur][1] = j;
                    sparseArray[cur][2] = sourceArray1[i][j];
                }
            }
        }
       /*
       //输出稀疏数组
        System.out.println("------------稀疏数组如下------------");
        for (int i = 0; i < sparseArray.length; i++) {
            System.out.printf("%d\t%d\t%d\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
        }

        //将稀疏数组 恢复成 原始的二维数组
        //1. 先读取稀疏数组的第一行,根据第一行数据,创建原始的二维数组
        int[][] sourceArray2 = new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i = 1; i < sparseArray.length; i++) {
            sourceArray2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        //输出转换后的二维数组
        System.out.println("----------转换后的二维数组如下-----------");
        for (int[] array : sourceArray2) {
            for (int data : array) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }
        */


        /*
            IO版本
         */
        saveToFile(sparseArray);
        // 读取文件,将文件中的稀疏数组输出并转换为 二维数组
        int[][] sparseArray3 = readFromFile();

        //输出稀疏数组
        System.out.println("------------稀疏数组如下------------");
        for (int i = 0; i < sparseArray3.length; i++) {
            System.out.printf("%d\t%d\t%d\n", sparseArray3[i][0], sparseArray3[i][1], sparseArray3[i][2]);
        }

        //将稀疏数组 恢复成 原始的二维数组
        //1. 先读取稀疏数组的第一行,根据第一行数据,创建原始的二维数组
        int[][] sourceArray3 = new int[sparseArray3[0][0]][sparseArray3[0][1]];
        for (int i = 1; i < sparseArray3.length; i++) {
            sourceArray3[sparseArray3[i][0]][sparseArray3[i][1]] = sparseArray3[i][2];
        }
        //输出转换后的二维数组
        System.out.println("----------转换后的二维数组如下-----------");
        for (int[] array : sourceArray3) {
            for (int data : array) {
                System.out.print(data + "\t");
            }
            System.out.println();
        }
    }
}

博主坚持日更,有疑问还请留言交流。

使用序列化的方式存储二维数组 这两天开始学习数据结构,这是存储棋盘的作业,因为网上其它方法都有了,为了复习IO流,就使用序列化的方式做了一下练习。 import java.io.*; import java.util.ArrayList; public class SparseArray { public static void main(String[] args) throws IOException, Clas... 阅读详情

相关推荐

稀疏数组与二维数组转化,将稀疏数组存入磁盘

算法学习之稀疏数组

weixin_52364868的博客 420

射频总集篇:(不断更新)

射频每一章涉及到的重点理论/设计方法 CHAPTER 1 传输线理论 输入阻抗Zin,负载阻抗ZL,驻波比ρ,反射系数 CHAPTER 2 波导 矩形波导,圆波导,同轴线 CHAPTER 3 微型带状传输线 微带线的参数设计,带状线的参数设计 CHAPTER 4 ...

jieyannn的博客 1921

利用IO读存取二维数组(压缩稀疏数组)

利用IO读存取压缩后的二维数组 首先我们不利用文件读取在控制台上展现出来 public class SparseArray { public static void main(String[] args) { //初始化棋盘 int[][] chessArr1 = new int[11][11];//0代表无子,1代表白子,2代表黑子 int sum = 0; chessArr1[2][3] = 1; chessArr1

weixin_47170306的博客 486

AgentScope深入分析-ReActAgent

ReActAgent 是 AgentScope 框架中最核心的智能体实现,它完美诠释了"推理-行动"(Reasoning-Acting)循环的精髓。本文将深入分析 ReActAgent 的类继承关系、核心执行流程,以及状态管理、钩子机制、实时介入等关键技术点。通过阅读本文,你会理解智能体如何与模型交互、如何执行工具、如何处理中断,以及这些机制背后的设计考量。模块化:通过组合不同的组件(模型、格式化器、工具集、记忆)来构建智能体透明性:所有关键流程都对开发者可见,可以精确控制可扩展性。

842

【RTD】二分法查找和分段线性插值算法在RTD中应用

二分法查找和分段线性插值算法在RTD中的典型应用。

只要思想不滑坡,想法总比问题多。 2371

java数组硬盘读取,java中如何通过IO流将稀疏数组写入磁盘和从磁盘中读取,整行存,整行取...

匿名用户1级2019-06-13 回答//写入磁盘public static void writ(int sparseArr[][]) {System.out.println("写入磁盘的数据中~~~~~~");File file = new File("E:\\java\\sparseArr.txt");BufferedWriter bw = null;try {bw = new Buffere...

weixin_35659266的博客 724

神经形态芯片:IBM TrueNorth技术详解以及应用案例

2018年的一项演示中,机器人使用TrueNorth处理了复杂的路径规划,功耗仅为传统系统的1/10。它通过模仿人脑的结构,解决了传统芯片在功耗和并行性上的痛点,并在图像识别、物联网和机器人等领域展现了强大潜力。:不同于传统芯片的时钟驱动,TrueNorth是事件驱动的。例如,工厂中的振动传感器使用TrueNorth检测设备故障的早期迹象,实现了更高效的维护策略,避免了停机时间。:在医疗领域,TrueNorth可以用于可穿戴设备,比如一个智能助听器,它能过滤噪音并增强特定声音,功耗低到可以用纽扣电池供电。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2477

以五子棋为背景的二维数组和稀疏数组(节省空间)的转换、用io流实现本地磁盘的存储

用二维数组来表示一个棋盘: 创建一个原始的二维数组 11*11 0表示没有棋子 1表示黑子 2表示蓝子 int[][] chessArray = new int[11][11]; chessArray[1][2] = 1; chessArray[2][3] = 2; chessArray[6][6] = 2; for (int[] i : chessArray) { for (int e : i) {

m0_61454947的博客 426

Qt —— 百度地图 - 3、Qt调用高德在线地图功能示例(附源码)

Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)

497

【OpenCV C++】基本绘图操作

OpenCV C++基本绘图操作程序说明代码运行效果 程序说明 // 程序描述:OpenCV C++基本绘图操作 //参 考:毛星云《OpenCV3编程入门》 // 操作系统: Windows 10 64bit // 开发语言: C++ // IDE 版 本:Visual Studio 2019 // OpenCV版本:4.20 代码 main函数写法很简单,先创建空表Mat图像,然后点用函数绘制化学原子图,接着绘制组合图,最后显示图像。 //-------------------------

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 765

JAVA如何存储二维数组

JAVA如何存储二维数组直接存储二维数组的缺点稀疏数组介绍稀疏数组的应用场景将稀疏数组转回原二维数组代码实现 直接存储二维数组的缺点 如果在二维数组中只使用了几个元素,就直接存储在内存中,这样会造成空间浪费。 由于直接使用二维数组会造成空间浪费,所以就引出了一个新的数组:稀疏数组。 稀疏数组介绍 稀疏数组的处理方法: 1)记录原二维数组的行数和列数,有多少个不同的值 2)把每个不同的值在原二维数组中的下标记录 3)稀疏数组的第一行的数据一定是原二维数组的行数和列数,和非0数字的个数 4)从第二行开始记录每个

weixin_43328382的博客 3264

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

二维数组写入文件并读取

二维数组的概述 二维数组其实就是一个元素为一维数组的数组; 格式1: 数据类型[ ][ ] 变量名=new 数据类型[m][n]; m表示这个二维数组有多少个数组 n表示每一个一维数组的元素个数 举例: int[ ][ ] arr=new int[3][2]; 定义了一个二维数组arr 这个二维数组有3个一维数组,名称是ar[0],arr[1],arr[2] 每个一维数组有2个元素,可以通过arr[m][n]来获取 格式2: 数据类型[ ][ ] 变量名=new 数据类型[m][]; m表示这个二维数组有

一路的博客 4784

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

二维数组和稀疏数组的来回转换磁盘的写入写出

场景:将五子棋盘(二维数组)中,有效的数据保存到 稀疏数组中并将稀疏数组保存到本地文件。然后将读取文件中的数据,并将数据转换成二维数组。 因为五子棋该二维数组中有很多值是默认值 0, 因此记录了很多没有意义的数据.所以这里使用到 稀疏数组,保存有效数据。 解题思路: 二维数组 转 稀疏数组 并存入本地文件: 1. 遍历原始的二维数组,得到有效数据的个数 sum 2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3] 3. 将二维数组的有效数据数..

草上飞 470

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

用二维数组存储表格数据

package zuoye; import java.util.Arrays; /** * 数组存储表格数据 * @author 110 * 表格数据模型是计算机世界最普遍的模型,可以这么说,大家在互联网看到的所有数据本质上都是“表格” * 无非是表格之间互相套用。如下表格是一张雇员表 * ID 姓名 年龄 ...

guonengneng的博客 3567

JAVA二维数组与稀疏数组转换,保存稀疏数组到磁盘遇到的一些问题

今天在学读取本地磁盘的文件时遇到了一些问题。 包括一下几个地方: 1.while循环内计数器记不准。 2.错用了两个for循环。 3.文件的分行读取与字符串剪切。 4.分析out_i出的循环,虽然有冗余和不正确,但不至于报错啊 import java.io.*; public class SparseTest { public static void main(String[] args) { int[][] arr = new int[10][10]; arr[0

weixin_42977223的博客 418

数组写进硬盘、读出硬盘数组

存入硬盘 建立在我的另一边博客二维数组和稀疏数组转换基础上(一定要有java基础知识) 链接: link. System.out.println("开始存入硬盘"); System.out.println("..............."); FileWriter fileWriter=new FileWriter("E://java//bbb.txt");//写到哪里,并抛出异常 BufferedWriter bufferedWriter=new BufferedWriter(fileWri

green5858的博客 751

c# - 存储二维数组

using System; using System.IO; using System.IO.Compression; namespace ArrayTest { class Program { static void Main(string[] args) { ushort[,] orignalArray = new u...

yuxuac的专栏 2680

Java-二维数组写入txt

将二维数组存入txt import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Hello { public static void main(...

ohcezzz的博客 6196

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 290

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 348

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 203

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 135

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 368

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 506
上一篇: C语言实现扫雷游戏
下一篇: 数组模拟队列、环形队列 - 虽然简单但是细节很多
「已注销」
博客等级 码龄7年 11粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值