day09-Java数组
Java数组
9.稀疏数组
什么是稀疏数组?
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方式是:
记录数组一共有几行几列,有多少个不同的值
把具有不同值 的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
如下图:左边是原始数组,右边是稀疏数组


根据上图创建稀疏数组:
package li.bolog.array;
//创建稀疏数组
public class ArrayDemo08 {
public static void main(String[] args) {
//1.创建一个二维数组 11*11 0:代表没有棋子 1:黑棋 2:白棋
int[][] array1=new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//输出原始的数组
System.out.println("输出原始的数组:");
for (int[] ints:array1) {
for (int anInt:ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("=============================");
//转换为稀疏数组保存
//获取有效值的个数sum
int sum=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j] != 0) {
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
//2.创建一个稀疏数组
/*样式如图所示
一共有sum个有效值,则行数是sum+1,记录总行、列、有效值个数占一行,记录有效值占sum行
3列则是固定的,分别是行、列、值
*/
int[][] array2=new int[sum+1][3];
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非零的值存放到稀疏数组中
int count=0;
for (int i = 0; i < array1.length; i++) {//array1.length代表array1的行数
for (int j = 0; j < array1[i].length; j++) {//array1[i].length代表列数
if (array1[i][j] != 0) {
count++;//count数值从一开始,因为第0行已经存了稀疏数组的总行、列、有效值个数
array2[count][0]=i;//从当前行的第一个值存有效值的行数
array2[count][1]=j;//从当前行的第二个值存有效值的列数
array2[count][2]=array1[i][j];//从当前行的第三个值存放有效值数值
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"
+array2[i][1] +"\t"
+array2[i][2] +"\t");
}
System.out.println("=============================");
//稀疏数组还原
//1.读取稀疏数组
//array2[0][0]代表原来数组总行数 array2[0][1]代表原来数组总列数
int[][] array3 = new int[array2[0][0]][array2[0][1]];
/*
稀疏数组:
11 11 2
1 2 1
2 3 2
*/
//2.给其中元素还原值
for (int i = 1; i < array2.length; i++) {//array.length为稀疏矩阵的行数,这里具体值为3
array3[ array2[i][0] ][ array2[i][1] ] = array2[i][2];//这里只填入了有效值,其他的0值在array3创建时已经隐式初始化
}
//3.打印array3
System.out.println("输出还原的数组:");
for (int[] ints:array3) {
for (int anInt:ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}

day09-Java数组的更多相关文章
- Java 数组
数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...
- 第5章 Java数组
1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...
- Java 数组基础
数组 数组(Array):相同类型数据的集合. 定义数组 方式1(推荐,更能表明数组类型) type[] 变量名 = new type[数组中元素的个数]; 比如: int[] a = new int ...
- Java数组及其内存分配
几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...
- [转载]Java数组扩容算法及Java对它的应用
原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...
- Java数组技巧攻略
Java数组技巧攻略 0. 声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...
- Java数组扩容算法及Java对它的应用
1)Java数组对象的大小是固定不变的,数组对象是不可扩容的.利用数组复制方法可以变通的实现数组扩容.System.arraycopy()可以复制数组.Arrays.copyOf()可以简便的创建数组 ...
- Java数组与vector互转
Java数组与vector互转 /* Object[] object1 = null ; //数组定义 Vector<Object> object2;//Vector定义 object2 ...
- 比较Java数组,ArrayList,LinkedList,Vector 性能比较
public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...
- Java数组的12个常用方法
以下是12个关于Java数组最常用的方法,它们是stackoverflow得票最高的问题. 声明一个数组 String[] aArray = new String[5]; String[] bArra ...
随机推荐
- 内存池是什么原理?|内存池简易模拟实现|为学习高并发内存池tcmalloc做准备
前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.ne ...
- 【C语言深度解剖】预定义章节经典面试题讲解(offsetof宏模拟实现)【超详细的解释和注释】
[C语言深度解剖]预定义章节经典面试题讲解(offsetof宏模拟实现)[超详细的解释和注释] 那么这里博主先安利一下一些干货满满的专栏啦! 作者: #西城s 这是我的主页:#西城s 在食用这篇博客之 ...
- 在Windows下编译Saba
今天写一篇环境配置的博客,感觉这种博客比较好写 Saba是一个用于加载MMD(MikuMikuDance)模型.动作文件的C++库.下面我们在Windows下编译这个库.为了在Windows下 ...
- 21.1 TLS简述--《Windows核心编程》
一.TLS简述 我们知道在一个进程中,所有线程是共享同一个地址空间的.所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程.不过 ...
- delphi TThread.WaitFor 用法
在 Delphi 中,TThread.WaitFor 方法用于等待一个线程完成执行.当你创建一个线程并希望主线程(或其他线程)等待这个线程结束时,你可以使用这个方法. 以下是 TThread.Wait ...
- 从零开始的微信小程序入门教程(四),理解小程序事件与冒泡机制
壹 ❀ 引 我在之前初识WXML与数据绑定两篇文章中,介绍了小程序静态模板与样式相关概念,以及小程序几种常用数据绑定方式,在知道这些知识后,我们可以写一些不算复杂的小程序页面,并能将一些自定义的数据渲 ...
- react 高效高质量搭建后台系统 系列
react 高效高质量搭建后台系统 前言 目标:用 react 高效高质量搭建后台系统 如何实现:搞定一个优秀的.通用的.有一定复杂度的react的后台系统.类似项目就可以依葫芦画瓢快速展开. spu ...
- SAS (Statistics Analysis System) 统计分析系统软件
SAS SAS (Statistical Analysis System) 是一个统计软件系统,由 SAS Institute 开发, 用于数据管理, 高级分析, 多元分析, 商业智能, 刑事调查和预 ...
- 【Android】MediaCodec详解
1 前言 MediaCodec 主要用于视频解码和编码操作,可以实现视频倍速播放.全关键帧转换.视频倒放等功能. MediaCodec 的工作原理图如下: MediaCodec 的主要接口 ...
- 使用 Oracle PL/SQL NOCOPY 提示
参考文献: official document: http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm#LNPL ...