1. 索引数组

一、什么是索引数组?

所谓索引数组就是普通数组,以整数作为数组元素的索引下标。

二、实例。

备注:

(a)使用-a选项定义索引数组,使用一对小括号()定义数组中的元素列表。

(b)索引数组使用整数作为数组元素下标。

备注:

(a)使用@和*作为数组下标,表示获取所有元素。

三、实例。

备注:

(a)${#a[@]}和${#a[*]}都表示计算数组长度,也就是元素的数量。

四、实例。

备注:

(a)直接使用数组下标索引来修改数组中指定的元素。

五、实例。

备注:

(a)数组使用感叹号获取数组中所有已存在的元素的索引下标。

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程

2. 关联数组

一、什么是关联数组?

所谓关联素组指的是使用普通字符串作为数组下标,每一个元素形成一个键值对,也就是key-value。

二、实例。

备注:

(a)使用大写的-A选项配合小括号()定义关联数组。

(b)这个例子中使用字符串a作为键值对的key,Butianyun作为键值对的value,以此类推。

(c)关联数组也可以正常使用感叹号获取所有的索引下标,正常使用#这个符号获取数组的长度。

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程

3. 稀疏数组

一、什么是稀疏数组?

所谓稀疏数组是指整数作为数组索引下标时,所有的索引下标按照从小到大排序之后在数值上并不连续的数组,因为有一些索引下标对应的元素并不存在。

二、实例。

备注:

(a)这个例子中先定义了一个空的索引数组,然后直接对某一些索引序号对应的元素赋值,自然而然的创建了一个稀疏数组。

(b)索引数组中元素的排列次序是按照索引下标的整数从小到大排序的。

三、实例。

备注:

(a)索引数组也是支持直接在小括号内使用中括号指定每一个元素的索引下标。

四、实例。

备注:

(a)思考:

问题:这个数组a是索引数组还是关联数组?

答案:索引数组。原因:使用-a选项只能定义索引数组。

(b)如果在后面指定的索引下标跟前面的重复了,那么后面的索引下标对应的元素会覆盖掉前面的元素。效果上相当于前面的元素没有出现一样。

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程

4. 关联数组的元素排列次序

一、实例。

备注:

(a)思考:

问题:这个数组a是稀疏数组吗?

答案:不是。原因:使用大写的-A选项定义的是关联数组。

(b)如果使用关联数组,可以看到运行结果与索引数组完全不同。

(c)关联数组中的元素的排列既没有按照索引下标排序,不是按整数排序,也不是按字符串排序;也不是按照定义数组时元素出现的次序排序。排列次序看起来似乎是杂乱无章的。

二、实例。

备注:

(a)可以看到既不是按照键值对的key排序,也没有按照键值对的value排序。

(b)思考:

问题:为什么关联数组的元素排列出现这种看起来杂乱无章的排列次序?

答案:关联数组内部使用哈希技术。根据哈希的特性,key的次序无法决定key的哈希值的次序。

三、实例。

备注:

(a)对于这种只有一个字母作为key的关联数组,元素的排列次序看起来好像是有规律的,实际上却是是有规律的。

(b)下面使用随机化产生的关联数组来解释这种规律。

butianyun.sh脚本文件:

备注:

(a)总结:对于这种索引下标只有一个字母或数字的关联数组,元素排列次序有规律:

规律1:字母作为索引的,按照索引下标的ASCII码次序从大到小排列,也就是正常ASCII码次序的逆序排列。

规律2:数字作为索引的,按照索引下标的ASCII次序从大到小排列。

规律3:数字作为索引的元素排在字母作为索引的元素的前面。

(b)对于这种情况,元素排列次序并不能说成是按照ASCII次序从大到小排列,而是先把数字和字母分成了两大类。

备注:

(a)如果key不是一个字符,而是两个字符或更多字符,则没有这种规律了。

(b)下面这个例子更好的证明了这一点。

butianyun.sh脚本文件:

备注:

(a)随机化产生的关联数组,索引下标是两个字母或数字,这时元素的排列次序就没有规律,而是取决于key的哈希值。

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程

5. @和*的异同点

一、实例。

备注:

(a)数组a总共有三个元素,第二个元素包含一个空格。

(b)在这个例子中,使用@和 *并没有什么区别。

(c)不管使用@还是*,数组a的长度都是3。

备注:

(a)在这个例子中,使用@和*也没有什么区别。

(b)思考:

问题:为什么在把数组a的元素全部放置到数组b和c中之后,b和c的数组长度都是4呢?

答案:代码中对b和c的赋值,等效于如下代码。

备注:

(a)bash shell对命令行的参数的解析过程中,有一个去掉双引号的过程,相当于这些字符串都没有加双引号。所以就会被认为有四个元素。

二、实例。

备注:

(a)在对数组b和c赋值时,小括号()中加了双引号,使用@和*的效果就有了很大的区别。

(b)思考:

问题:为什么使用@之后数组b有3个元素,而使用*之后数组c只有1个元素?

答案:这跟bash shell对”${a[@]}”和”${a[*]}”的规定有关。

在bash shell中,把”${a[@]}”展开之后相当于将数组a的每一个元素加上双引号之后形成一个列表。

备注:

(a)这个例子解释了为什么数组b有三个元素。”Linux Bash”这个字符串在a中作为一个元素,在b中还是作为一个元素看待。

在bash shell中,把”${a[*]}”展开之后相当于将数组a的每一个元素形成一个列表之后再整体上加双引号,这样自然就只有一个元素了。

备注:

(a)这个例子解释了为什么数组c只有一个元素。”Butianyun Linux Bash Shell”这个字符串整体在c中作为一个元素看待。

三、实例。

理解@和*的区别有什么价值呢?下面讨论在for循环中的应用。

备注:

(a)数组a本身只有三个元素。第二个元素包含空格。

(b)在不加双引号时,不管使用@还是*,循环体都是执行四次。

(c)数组a的第二个元素”Linux Bash”被拆分成两个独立的词语。

备注:

(a)在使用@并且加了双引号之后,循环体只执行了三次。数组a的第二个元素并没有被拆分。

加双引号之后,相当于数组a的每一个元素加上双引号之后形成了一个列表。

备注:

(a)在使用*并且加了双引号之后,循环体只执行了一次。数组a的所有元素形成一个列表之后再加双引号,相当于数组a的所有元素合并成了一个整体。

下载Linux Bash Shell免费教程PDF文件:

点击此处下载  补天云C_CPP_QT工程师的Linux_Bash_Shell免费教程

Linux_Bash_Shell_索引数组和关联数组及稀疏数组的更多相关文章

  1. Java数组声明创建和使用以及多维数组、Arrays类、稀疏数组

    目录 数组概述 数组声明创建 内存分析 java内存分析 堆 栈 方法区 三种初始化 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 小结: 数组使用 数组基础使用 For E ...

  2. SparseArray HashMap 稀疏数组 二分法

    简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...

  3. 读lodash源码之从slice看稀疏数组与密集数组

    卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...

  4. 二维数组与稀疏数组的转换---dataStructures

    首先我们看一个需求 在11 * 11 的五子棋的棋盘中 我们使用0代表十字交叉点也是无效的数据 用1代表黑棋 用2代表蓝棋 那么所看到的棋盘如下 改用数字显示后就如一下样式 现在我们需要将怎个棋盘存储 ...

  5. 数据结构与算法之java语言实现(一):稀疏数组

    一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...

  6. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

  7. 图解Java数据结构之稀疏数组

    在编程中,算法的重要性不言而喻,没有算法的程序是没有灵魂的.可见算法的重要性. 然而,在学习算法之前我们需要掌握数据结构,数据结构是算法的基础. 我在大学的时候,学校里的数据结构是用C语言教的,因为对 ...

  8. 你听过稀疏数组(sparseArray)吗?

    稀疏数组(sparseArray) 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值 ...

  9. Java数据结构之稀疏数组(Sparse Array)

    1.需求 编写的五子棋程序中,有存盘退出和续上盘的功能.因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,为了压缩存储所以采用稀疏数组. 2.基本介绍 当一个数组中大部分元素为0,或者为 ...

  10. Java稀疏数组

    一.概述 1.概念 2.处理方法 3.示例 原数组如下: 转换为稀疏数组如下: 二.代码 1.主方法 @Testpublic void SparseTest() { // 创建一个原始的二维数组 11 ...

随机推荐

  1. 数据仓库建模工具之一——Hive学习第四天

    Hive的基本操作 1.3HIve的表操作(接着昨天的继续学习) 1.3.2 显示表 show tables; show tables like 'u*'; desc t_person; desc f ...

  2. 学习笔记--Java中方法递归调用

    Java中方法递归调用 public class RecursionTest01{ public static void main(String[] args){ System.out.println ...

  3. Pandas库学习笔记(1)

    参考:菜鸟教程 pandas库使用了NumPy的大多数功能.建议您先阅读有关NumPy的教程,然后再继续本教程. Pandas 适用于处理以下类型的数据: 与 SQL 或 Excel 表类似的,含异构 ...

  4. CF916C 题解

    CF916C 题解 思路 思考发现,如果我们让很多边的边权变得非常大,而故意留下 \(1\) 到 \(n\) 的某一条路径,使整条路径之和甚至还没有剩下一条边的权值大,这条路径显然就是最短路了. 更重 ...

  5. JMeter+Ant+Jenkins接口自动化测试框架(Windows)

    一:简介 大致思路:Jmeter可以做接口测试,也能做压力测试,而且是开源软件:Ant是基于Java的构建工具,完成脚本执行并收集结果生成报告,可以跨平台,Jenkins是持续集成工具.将这三者结合起 ...

  6. python面向对象游戏练习:好人坏人手枪手榴弹

    python面向对象游戏练习:好人坏人手枪手榴弹 主要是多态的练习,对象作为参数传给方法使用 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 ...

  7. Windows10 myeclipse 本地部署javaweb项目

    Windows10 myeclipse 本地部署javaweb项目 一,先在网上寻找相关的项目,自己研究学习之后,进行二次开发 原文地址https://www.cnblogs.com/wydyzcnc ...

  8. 【Vue】Re19 Promise

    一.概述 Promise是异步编程的解决方案 异步事件的处理: 封装的异步请求函数不能立即获取结果, 通常会传入另外一个函数,在请求成功的时候将数据通过传入的函数回调出去 如果只是一个简单的请求,那么 ...

  9. 利用强化学习算法解释人类脑对高维状态的抽象表示:how humans can map high-dimensional sensory inputs in actions

    论文: <Using deep reinforcement learning to reveal how the brain encodes abstract state-space repre ...

  10. OpenAI内讧更多细节曝光:奥特曼离间董事会失败

    参考: https://www.thepaper.cn/newsDetail_forward_25512687 ============================== 根据 https://ww ...