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数组的更多相关文章

  1. Java 数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如numbers[100 ...

  2. 第5章 Java数组

    1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...

  3. Java 数组基础

    数组 数组(Array):相同类型数据的集合. 定义数组 方式1(推荐,更能表明数组类型) type[] 变量名 = new type[数组中元素的个数]; 比如: int[] a = new int ...

  4. Java数组及其内存分配

    几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...

  5. [转载]Java数组扩容算法及Java对它的应用

    原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...

  6. Java数组技巧攻略

      Java数组技巧攻略 0.  声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...

  7. Java数组扩容算法及Java对它的应用

    1)Java数组对象的大小是固定不变的,数组对象是不可扩容的.利用数组复制方法可以变通的实现数组扩容.System.arraycopy()可以复制数组.Arrays.copyOf()可以简便的创建数组 ...

  8. Java数组与vector互转

    Java数组与vector互转 /* Object[] object1 = null ; //数组定义 Vector<Object> object2;//Vector定义 object2 ...

  9. 比较Java数组,ArrayList,LinkedList,Vector 性能比较

    public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...

  10. Java数组的12个常用方法

    以下是12个关于Java数组最常用的方法,它们是stackoverflow得票最高的问题. 声明一个数组 String[] aArray = new String[5]; String[] bArra ...

随机推荐

  1. 架构设计脱胎换骨!英特尔酷睿Ultra深度解析

    英特尔正式发布了第一代酷睿Ultra处理器平台,也就是首个基于Intel 4制程工艺(7nm)打造的移动级处理器平台,其核心代号为Meteor Lake,产品系列贴标设计也采用了全新方案. 同时在命名 ...

  2. php批量更新多条数据

    /** * @param $table 表名 * @param array $multipleData 拼接的批量更新的数组格式: * $students = [['id' => 1, 'cit ...

  3. CH57x/CH58x/CH59x iBecaon广播

    首先要先了解iBecaon.iBecaon是苹果基于BLE广播的一个技术规范:只要设备生产商符合特定标准,就可以要求苹果授权它们在其设备上使用"iBeacon" 商标. 在设备生产 ...

  4. ElasticSearch7.3学习(三十四)----生产环境集群部署总结

    1.集群部署 2.结点的三个角色 主结点:master节点主要用于集群的管理及索引 比如新增结点.分片分配.索引的新增和删除等. 数据结点:data 节点上保存了数据分片,它负责索引和搜索操作. 客户 ...

  5. 基于keras的文本情感识别

    情感识别是一个典型的分类问题,可以使用Keras来实现,本文是之前整理的笔记,分享出来大家一起学习.   流程描述 Keras文本情感分类基于机器学习算法,会根据大量数据训练出分类模型,然后使用训练好 ...

  6. 亚马逊Dynamo数据库解读(英文版)

    最近看了亚麻的Dynamo,个人认为其中always writeable的业务目标,对于DHT,vector clock,merkel tree的应用,包括对于一致性和高可用的权衡(基于CAP猜想,实 ...

  7. JS leetcode 移除元素 题解分析

    壹 ❀ 引 又到了每日一道算法题的环节,今天做的题同样非常简单,题目来源leetcode27. 移除元素,题目描述如下: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 va ...

  8. NC16664 [NOIP2004]合唱队形

    题目链接 题目 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2-,K,他们的身高分 ...

  9. CF-928(已更新:B C E)

    CF-928 排名四千多,目前为止排名最高的一场~ E题我赛时基本上是猜的结论(但是也推了快一小时才想到有这个可能性),因此目前只能放个码在这(⊙﹏⊙) D的话问了学长思路,正在补了0-^-0 --但 ...

  10. STM32 printf 方法重定向到串口UART

    在嵌入式系统中调试代码是很麻烦的一件事, 如果能方便地输出调试信息(与调试者交互), 能使极大加快问题排查的过程. 串口在嵌入式领域是一个比较重要的通讯接口. 因为没有显示设备, 在单片机的程序里调用 ...