草庐IT

Linux_Bash_Shell_索引数组和关联数组及稀疏数组

C/C++/QT界面开发界面美化 2023-03-28 原文

 

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作为键值对的keyButianyun作为键值对的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的元素全部放置到数组bc中之后,bc的数组长度都是4呢?

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

 

 

 

备注:

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

 

二、实例。

 

 

 

 

备注:

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

(b)思考:

问题:为什么使用@之后数组b3个元素,而使用*之后数组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. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  7. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  8. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  9. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  10. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

随机推荐