java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取
稀疏数组和二维数组转换
稀疏数组:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
稀疏数组的处理方法:
- 记录数组一共有多少行,有多少个不同的值
- 把具有不同值得元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
应用:
- 保存二维数组(棋盘、地图)
- 二维数组 ——> 稀疏数组的思路
- 遍历原始二维数组,得到有效数据的个数sum
- 根据sum创建稀疏数组
SparseArr int[sum + 1][3]
- 将二维数组的有效数据存入到稀疏数组
- 稀疏数组 ——> 二维数组
- 读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组,比如上面的
chessArr2 = int[11][11]
- 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
- 读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组,比如上面的
package com.starking.sparseArr;/*** @author Manix* 稀疏数组和原始二维数组的相互转换写入文件,保存和读取*/public class SparseArray {public static void main(String[] args) {//创建一个二维数组 11*11//0:没有棋子,1:黑子, 2:蓝子int[][] chessArr1 = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;//输出原始二维数组System.out.println("原始的二维数组为:");for (int[] row : chessArr1) {for (int item : row) {System.out.printf("%d\t", item);}System.out.println();}//将二维数组 转 稀疏数组的思路//先遍历二维数组,得到非0个元素个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {sum++;}}}System.out.println("有效元素的数量Sum为:" + sum);//2.创建对应的稀疏数组int[][] sparseArr = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;// 给稀疏数组赋值int count = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//输出稀疏数组System.out.println();System.out.println("原始二维数组----》---稀疏数组:");for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);}//将稀疏数组----》---恢复成原始的二维数组int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}System.out.println();//输出恢复之后的二维数组System.out.println("稀疏数组----》---恢复的二维数组:");for (int[] row : chessArr2) {for (int item : row) {System.out.printf("%d\t", item);}System.out.println();}}/*** 添加保存稀疏数组和从本地文件读取稀疏数组的功能*/// 创建内部类---保存和读取稀疏数组工具类public static class SaveAndReadUtil {// 写入文件的方法public static void saveArray(int[][] array, String path) {
// 创建文件输入流FileWriter fw = null;try {
// 写入的文件路径及文件名File file = new File(path);if (!file.exists()) {file.createNewFile();}//把文件写入到字节流中fw = new FileWriter(file);//循环遍历数组写入for (int[] ints : array) {for (int j = 0; j < array.length - 1; j++) {fw.write(ints[j] + "\t");}//数组的最后一行不加"\t"fw.write(ints[array[0].length - 1] + "");fw.write("\n");}//刷新流fw.flush();} catch (IOException e) {e.printStackTrace();} finally {try {//如果fw不为空,就将其关闭if (fw != null) {fw.close();}} catch (IOException e) {e.printStackTrace();}}}//读取数组文件的方法public static int[][] readArray(String path) {//声明字符输入流FileReader fr = null;//声明字符输入缓冲流BufferedReader br = null;//定义一个二维数组int[][] sparseArr0 = null;try {fr = new FileReader(path);//通过BufferReader包装字符输入流br = new BufferedReader(fr);//穿件一个集合用来存读取的文件数据List<String> list = new ArrayList<>();//用来存放一行的数据String lineStr;//逐行读取文件内容while ((lineStr = br.readLine()) != null) {list.add(lineStr);}//获取文件的行数int lineNum = list.size();//获取文件列数String s = list.get(0);int columnNum = s.split("\t").length;//根据文件行数和列数创建对应的数组sparseArr0 = new int[list.size()][columnNum];//记录输出当前行数int count = 0;//遍历集合,将集合中的数据存入数组中for (String str : list) {//读取str按照“\t”分割,用字符串数组接收String[] strs = str.split("\t");for (int i = 0; i < columnNum; i++) {sparseArr0[count][i] = Integer.parseInt(strs[i]);}count++;}} catch (IOException e) {e.printStackTrace();} finally {//关闭字符输入流try {if (fr != null) {fr.close();}} catch (IOException e) {e.printStackTrace();}try {if (br != null) {br.close();}} catch (IOException e) {e.printStackTrace();}}//返回稀疏数组return sparseArr0;}}}
相关文章:

springboot redis配置
1、引入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2、redis连接配置 spring:redis:host: 10.220.1.41port: 6379timeout: 10000passwor…

C# 根据节点索引访问XML配置文件
查了一些,都是根据XML属性来访问指定节点,我这想根据节点索引来访问XML 首先上XML样式 1 <?xml version"1.0" encoding"utf-8" ?> 2 <FeatureClasses> 3 <FeatureClass name "t_room"></Feat…

ASP.NET DEMO 14: 如何在 GridView/DataGrid 模板列中使用自动回发的 CheckBox/DropDownList
有时候希望在 GridView 模板中使用自动回发的 CheckBox (autopostbacktrue) ,但是 CheckBox 没有 CommandName 属性,因此也就无法在 GridView.RowCommand 事件中处理,并且如何获取当前 GridView 行信息呢?我们可以选择…

BI.寒号鸟请吃烧烤/意外入手“speed- dear friends vol.1”/入手“鲍家街43号”/我爱红红/我爱红红...
先说,昨天下午,在逛完西北政法的乐图后,辗转到了高新区,见到了在经典论坛认识的热情的热心的热烈的寒号鸟兄弟,而notus本人则感动的热泪盈眶,想不到在遥远的西安,都有人惦记着我 T_T附上我们的合…

数据结构----单链表增删改查
单链表的增删改查 一、链表(Linked List) 链表是有序列表,以节点的方式来存储的,链式存储;每个节点包含data域,next域:指向下一节点;链表的各个节点不一定是连续存储;链…

Using NUnit with Visual Studio 2005 Express Editions
允许通过Build Toolbar选择"Debug" or "Relese"设置"工具" -> "选项..." -> 选择"显示所有设置" -> "项目和解决方案" ->选择"显示高级生成配置" 在VS2k5 Express工程中使用NUnit-GUI测试&…

代理上网环境下配置TortoiseCVS
以NASA Wind World为例,SF上的提示如下: http://sourceforge.net/cvs/?group_id69528 Anonymous CVS Access This projects SourceForge.net CVS repository can be checked out through anonymous (pserver) CVS with the following instruction set.…

ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) {OS_ERR err;CPU_INT08U isTheFirstCh;OSSemPend(&Usart1Sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源OSSemPend(&Usart1TxBufSem, 0, OS_O…

几款自用的IDEA高效插件
idea几款自用的高效小插件1、CodeGlance2、Translation3、Rainbow Brackets4、Statistic5、Markdown Navigator6、MarkDown Navigator1、CodeGlance CodeGlance是一款非常好用的代码地图插件,可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以…

CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。 relative:对象遵循正常文档流,但将依据top&am…

ASP.NET 2.0 ajax中gridView的刷新问题!
我是一个经常使用ASP.NET2.0的开发人员,最近看了ajax课程,也想使用一下Ajax这个强大的技术,我就使用了,在一个UpdatePanel中放入了一个gridView,果然能达我的满意效果,设置了gridView中的分页,相应的代码我都已经写好了.唯一的问题是当我点击了第二页的时候,我再点击刷新,当前页…

心灵小栈: 镌刻在地下500米的母爱
这位母亲叫赵平饺,今年48岁。谁能想到,在不见天日的煤井深处,她已经弓着脊梁爬行了13 年。1993年,赵平姣的丈夫陈达初在井下作业时被矿车压断了右手的三根手指。此后他只能在井上干轻活,收入少了一大截。为了供女儿陈娟…

js学习总结----crm客户管理系统之项目开发流程和api接口文档
CRM ->客户管理系统 CMS ->内容发布管理系统 ERP ->企业战略信息管理系统 OA -> 企业办公管理系统 产品 / UI设计:需求分析,产品定位,市场调查...按照产品的规划设计出对应的效果图(PSD->photoshop) 前端开发工程师 API接口文…

数据结构--数组队列的实现
数据结构--数组模拟队列1. 说明2. 实现代码1. 数组队列类2.数组队列测试类3.代码运行结果3.完整代码1. 说明 队列是一个有序列表,可以用数组或者链表来实现。 遵循先入先出(FIFO)的原则,即先存入列的数据,会被先取出&…

DIV+CSS一行两列布局
实现效果: main 我是包在外面的div col1 我是第一列col2 我是第二列clear-float;我用来清除浮动(清除float)以下是说明:CSS代码:.main{width:800px;/* 总的宽度 */ background:red; } .main .col1{ float:left;/* 这个…

编程上标和下标使用方法
1.问题:写代码要求显示平方、立方、化学符号等等完全写不出来,Word写出来复制出来也不管用 2.办法:Unicode下标和上标 3.举例:string.Format("{0} km\xB2",1000),单位是平方千米&…

上周新闻回顾:微软补丁个个紧急 奥运网络百花齐放
也许是美国不是黄金周的原因,五一刚过,直接来自国外的新产品发布等IT新闻就源源不断涌来,倒是国内的新闻发布不是非常多。不过,微软的5月安全补丁如期发布,还是值得大家关注的。此外,关于2008年奥运会网络建…

rest-framework之解析器
rest-framework之解析器 本文目录 一 解析器的作用二 全局使用解析器三 局部使用解析器四 源码分析回到目录一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理。 有application/json,x-www-form-urlencoded,form-data等格式…

httpd常用配置
author:JevonWei版权声明:原创作品 检查配置文件时,如下提示,则因为没有server的服务名称导致,故设置网站的服务server名称,若没有设置web服务名,主默认解析系统主机名(添加主机名解析) [rootda…

[导入]C#中实现Socket端口复用
一、什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分。这种多重绑定便称之为端口复用。 二、…

数据结构学习系列文章合集
数据结构学习系列文章目录前言1.稀疏数组和队列稀疏数组和二位数组的转换数组队列的实现环形队列的介绍与实现2.链表单链表的增、删、改、查总结前言 学习数据结构记录,作为自己的笔记,同时也可以方便大家一起交流和学习 1.稀疏数组和队列 稀疏数组和二…

支付宝Payto接口的c#.net实现
它现在这种支付方式比较多象网银在线等使用的方法都是url验证,就是通过url参数和一个这些url参数的md5编码来确认这个连接的正确性,支付宝在你购买成功后跳转自定义连接的时候会传2次过来,第一次是数据底层请求,第二次是web请求&a…

【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton
概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。 FlexGrid 简介 FlexGrid 是业界…

如何 SQL Server 2005 实例之间传输登录和密码
INTRODUCTION 本文介绍如何不同服务器上的 Microsoft SQL Server 2005 实例之间传输登录和密码。 本文, 服务器 A 和服务器 B 是不同的服务器。 此外, 服务器 A 和 B 服务器都运行 SQL Server 2005。 将数据库从服务器 A 上的 SQLServer 实例移到 B, 服务器上的 SQLServer 实例…

IDEA配置GitHub报错GitHub Invalid authentication data.404 Not Found-Not Found
登录账户GitHub Invalid authentication data.404 Not Found-Not Found报错及解决办法1 登录自己的github账号--》头像---》settting2 Developer settings3 Personal access tokens4 回到IDEA中,粘贴上自己的token就可以了想要把自己的代码上传到GitHub中࿰…

console.log 简写
console.log 简写 平常代码调试总会用到console.log,但是每次写这么长也是很麻烦,就想着存一个简介一点的变量; 然后就随手写了下面代码; var a 10;var log console.log;log(a);调用的时候发现火狐浏览器报错了,仔细…

为何我的BLOG不能DIY?
今天想把MODULE调整一下,居然搞不定。估计是服务器又出问题了........不知道51CTO有没有备份我们的博克呀?

Java中的自动装箱和拆箱
自动装箱和拆箱自动装箱和拆箱自动装箱:拆箱1. 为什么要有包装类(或封装类)2. 基本数据类型与对应的包装类:3. 类型间的转换4. 何时发生自动装箱和拆箱赋值、数值运算时方法调用时:自动装箱、拆箱中的坑自动装箱和拆箱 目的&…

【Java】身份证号码验证
代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 1 package xxx;2 3 /**4 * Created by wdj on 2017/6/21.5 */6 7 import java.text.ParseException;8 import java.text.SimpleDateFormat;9 import java.util.Calendar;10 import java.util…

linux history记录格式修改
#保存一万条命令记录 sed -i s/^HISTSIZE1000/HISTSIZE10000/g /etc/profile#在/etc/profile的文件尾部添加如下行数配置信息 ######jiagu history xianshi######### USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g if [ "$USER_IP" &quo…