ruby的数据结构--数组(Array)

数组是一个集合,但是不仅仅是数字的集合,可以是任何对象(String、 Integer、 Fixnum、 Hash、 Symbol 等对象)的集合。数组的索引是从0开始的有序整数,可以通过正数索引或者负数索引来寻找数组中的值,数组中的值是有顺序的。

1、创建数组的方式

(1)直接创建

irb(main):018:0> arr = ["name",36,nil,23]

=> ["name", 36, nil, 23]

1

2

(2)快速定义字符串数组%w后面跟{},注意是大括号{},不是中括号[]

irb(main):019:0> arr = %w{2018-01-02 2018-01-03 2018-01-04}

=> ["2018-01-02", "2018-01-03", "2018-01-04"]

1

2

数组的索引可以用正数或者负数表示,我做了一个图,帮助大家理解。

取值举例:

irb(main):022:0> arr = ["a","b","c","d","e"]

=> ["a", "b", "c", "d", "e"]

irb(main):023:0> arr[0]

=> "a"

irb(main):024:0> arr[-1]

=> "e"

1

2

3

4

5

6

2、类型转换

(1)数组转字符串to_s、join

实际操作中,常用join方法,join方法比较灵活,可以将每个数组元素用任意字符拼接起来,连成一个字符串。

irb(main):020:0> arr = ["name",36,nil,23]

=> ["name", 36, nil, 23]

irb(main):021:0> arr.to_s

=> "[\"name\", 36, nil, 23]"

irb(main):022:0> arr.join

=> "name3623"

irb(main):023:0> arr.join(",")

=> "name,36,,23"

irb(main):024:0> arr.join("-")

=> "name-36--23"

1

2

3

4

5

6

7

8

9

10

(2)字符串转数组split、eval

如果字符串的形式同将数组直接to_s之后的形式一样,那么可以用eval方法将字符串转换成数组

irb(main):025:0> str1 = "name-36--23"

=> "name-36--23"

irb(main):026:0> str1.split("-")

=> ["name", "36", "", "23"]

irb(main):028:0> str2 = "[\"name\", 36, nil, 23]"

=> "[\"name\", 36, nil, 23]"

irb(main):029:0> eval(str2)

=> ["name", 36, nil, 23]

1

2

3

4

5

6

7

8

3、数组操作

(1)数组并集、合集、相加、相减

a&b 取a数组和b数组中元素的并集

a|b 取a数组和b数组中元素的合集

a+b 将a数组和b数组中的元素组合

a-b 从a数组中去除与b数组相同的元素

irb(main):034:0> a= [1,2,4,5]

=> [1, 2, 4, 5]

irb(main):035:0> b = [3,2,1]

=> [3, 2, 1]

irb(main):036:0> a & b

=> [1, 2]

irb(main):037:0> a | b

=> [1, 2, 4, 5, 3]

irb(main):038:0> a + b

=> [1, 2, 4, 5, 3, 2, 1]

irb(main):039:0> a - b

=> [4, 5]

1

2

3

4

5

6

7

8

9

10

11

12

(2)数组与乘法的神奇组合

a * int 将a数组乘整数,得到int个a数组元素

a * str 将a数组乘一个字符串,和上面讲的join方法差不多,返回一个由str间隔数组元素的字符串

irb(main):040:0> a = [3,2,1]

=> [3, 2, 1]

irb(main):041:0> a * 3

=> [3, 2, 1, 3, 2, 1, 3, 2, 1]

irb(main):042:0> a * "-"

=> "3-2-1"

irb(main):043:0> a * "Hello"

=> "3Hello2Hello1"

1

2

3

4

5

6

7

8

(3)arr << obj 将obj元素添加到数组中

与方法+的区别:

1)+只适应于两个数组相加,不适应于数组加字符串。两个数组相加返回一个一层数组,不会改变原先的数组

2)<<后面可以接多种类型,实际应用中,多用于接字符串,两个数组相加会返回一个二级数组,会改变原先数组的元素

irb(main):001:0> a= [1,2,4,5]

=> [1, 2, 4, 5]

irb(main):002:0> b = [3,2,1]

=> [3, 2, 1]

irb(main):003:0> c = "hello"

=> "hello"

#返回一个一层数组

irb(main):004:0> a + b

=> [1, 2, 4, 5, 3, 2, 1]

#c为一个字符串,与数组用+符号连接会报错

irb(main):005:0> a + c

TypeError: no implicit conversion of String into Array

from (irb):5

#a数组在进行+操作之后,数组中元素没有变化

irb(main):006:0> a

=> [1, 2, 4, 5]

#返回一个二层数组(即数组里面包含了数组)

irb(main):007:0> a << b

=> [1, 2, 4, 5, [3, 2, 1]]

irb(main):008:0> a << c

=> [1, 2, 4, 5, [3, 2, 1], "hello"]

#进行<<操作后,数组中的元素发生了变化

irb(main):009:0> a

=> [1, 2, 4, 5, [3, 2, 1], "hello"]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

(4)== 两个数组比较,相同返回true,否则返回false。数组相同说明数组中元素个数,顺序,内容都相等

irb(main):010:0> [1,2,3] == [1,2,3]

=> true

irb(main):011:0> [1,2,3] == [1,2]

=> false

irb(main):012:0> [1,2,3] == [3,2,1]

=> false

1

2

3

4

5

6

(5)arr[index] 返回数组中index索引对应的值,如果在数组中没有index索引,则返回nil

arr[start,length] 从start索引开始,取length个值

arr[start…end]取索引为start到索引为end对应的值,包含索引为end的值

arr[start…end]取索引为start到索引为end对应的值,不包含索引为end的值

#定义一个数组

irb(main):013:0> arr = [5,6,7,8,9,10,1,2,3,4]

=> [5, 6, 7, 8, 9, 10, 1, 2, 3, 4]

irb(main):014:0> arr[0]

=> 5

#取索引为3的数,即第四个值

irb(main):015:0> arr[3]

=> 8

#从索引3开始取两个值

irb(main):017:0> arr[3,2]

=> [8, 9]

#从索引3开始取7个值

irb(main):018:0> arr[3,7]

=> [8, 9, 10, 1, 2, 3, 4]

#取索引为3到索引为7对应的值,包含索引为7的值

irb(main):020:0> arr[3..7]

=> [8, 9, 10, 1, 2]

#取索引为3到索引为7对应的值,不包含索引为7的值

irb(main):021:0> arr[3...7]

=> [8, 9, 10, 1]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

(6)arr.length 返回arr数组元素个数

irb(main):023:0> a = [1,2,3,4,5]

=> [1, 2, 3, 4, 5]

irb(main):024:0> a.length

=> 5

1

2

3

4

(7)each 遍历数组

arr.each 迭代器,用来遍历数组,返回每个数组的值

arr.each_with_index 遍历数组的返回,每个数组的值以及对应的索引

irb(main):026:0> [1,2,3,4,5].each {|x| puts "此次返回的值为:" + x.to_s}

此次返回的值为:1

此次返回的值为:2

此次返回的值为:3

此次返回的值为:4

此次返回的值为:5

=> [1, 2, 3, 4, 5]

#用do...end包裹的块

irb(main):028:0> [1,2,3,4,5].each_with_index do |x,index|

irb(main):029:1*  puts "#{x}在数组中的索引是#{index}"

irb(main):030:1> end

1在数组中的索引是0

2在数组中的索引是1

3在数组中的索引是2

4在数组中的索引是3

5在数组中的索引是4

=> [1, 2, 3, 4, 5]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

(8)delete 删除元素

arr.delete(obj) 根据数组的值删除数组元素。数组中有obj元素,返回该元素,数组自身会改变,数组中没有obj元素,返回nil

arr.delete_at(index) 根据数组的索引删除数组元素。数组中有index索引,返回改索引对应的值,数组自身会改变,数组中没有index索引,返回nil

irb(main):043:0> arr1 = [1,1,2,3,1,4,5]

=> [1, 1, 2, 3, 1, 4, 5]

#删除值为1的元素

irb(main):044:0> arr1.delete(1)

=> 1

#arr1数组发生了变化,值为1的元素被全部删除

irb(main):045:0> arr1

=> [2, 3, 4, 5]

#arr1数组中没有值为8的元素,返回nil

irb(main):046:0> arr1.delete(8)

=> nil

#重新定义一个数组arr2

irb(main):047:0> arr2 = [1,2,3,4,5]

=> [1, 2, 3, 4, 5]

#删除索引为2的元素

irb(main):048:0> arr2.delete_at(2)

=> 3

#arr2数组发送了变化,原先索引为2的元素以为删除,现在索引为2的元素对应的值为4

irb(main):049:0> arr2

=> [1, 2, 4, 5]

#arr2数组中没有索引为8的元素,返回nil

irb(main):050:0> arr2.delete_at(8)

=> nil

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

(9)arr.empty? 判断数组是否为空

irb(main):052:0> arr1 = []

=> []

irb(main):053:0> arr2 = [nil]

=> [nil]

irb(main):054:0> arr3 = [1,2,3]

=> [1, 2, 3]

irb(main):055:0> arr1.empty?

=> true

#nil也相当于一个数组元素,所有arr2数组不为空

irb(main):056:0> arr2.empty?

=> false

irb(main):057:0> arr3.empty?

=> false

1

2

3

4

5

6

7

8

9

10

11

12

13

(10)取数组前面或者后面的值

arr.first 取数组第一个值,即索引为0的值

arr.first(n) 取数组前n个值

arr.last 去数组最后一个值

arr.last(n) 取数组最后n个值

irb(main):061:0> arr = [1,2,3,4,5,6,7,8]

=> [1, 2, 3, 4, 5, 6, 7, 8]

irb(main):062:0> arr.first

=> 1

irb(main):063:0> arr.first(3)

=> [1, 2, 3]

irb(main):064:0> arr.last

=> 8

irb(main):065:0> arr.last(4)

=> [5, 6, 7, 8]

1

2

3

4

5

6

7

8

9

10

(11)arr.flatten flatten英文的意思是变平,就是将层数大于1层的数组,变为一层数组

irb(main):066:0> a = [1,2,3]

=> [1, 2, 3]

irb(main):067:0> b = [2,3,4]

=> [2, 3, 4]

irb(main):068:0> c = [3,4,5]

=> [3, 4, 5]

#返回一个二层数组

irb(main):069:0> d = a << b << c

=> [1, 2, 3, [2, 3, 4], [3, 4, 5]]

#数组扁平化之后的效果

irb(main):070:0> d.flatten

=> [1, 2, 3, 2, 3, 4, 3, 4, 5]

1

2

3

4

5

6

7

8

9

10

11

12

(12)arr.uniq 将arr中的重复值去掉,返回一个没有重复的数组,常与flatten一起应用

irb(main):071:0> a = [1, 2, 3, 2, 3, 4, 3, 4, 5]

=> [1, 2, 3, 2, 3, 4, 3, 4, 5]

#将数组中重复的值去掉

irb(main):072:0> a.uniq

=> [1, 2, 3, 4, 5]

#如果是二层数组,将数字扁平化之后,再将重复的值去掉

irb(main):073:0> b = [1, 2, 3, [2, 3, 4], [3, 4, 5]]

=> [1, 2, 3, [2, 3, 4], [3, 4, 5]]

irb(main):074:0> b.flatten.uniq

=> [1, 2, 3, 4, 5]

1

2

3

4

5

6

7

8

9

10

(13)arr.include?(obj) 数组arr是否包含obj

#定义一个数组

irb(main):076:0> arr = ["1",2,nil,3,"m"]

=> ["1", 2, nil, 3, "m"]

#需要区分字符串和数字,包含字符串"1",而不包含数字1

irb(main):077:0> arr.include?("1")

=> true

irb(main):078:0> arr.include?(1)

=> false

irb(main):079:0> arr.include?(nil)

=> true

1

2

3

4

5

6

7

8

9

10

(14)arr.insert(index,obj…) 在arr数组中在index索引的位置插入obj一个值或多个值

#快速定义字符串数组的方法,注意是{}而不是[]

irb(main):080:0> arr = %w{a b c d e}

=> ["a", "b", "c", "d", "e"]

#在索引为1的位置,插入字符"f",其他字符后移

irb(main):081:0> arr.insert(1,"f")

=> ["a", "f", "b", "c", "d", "e"]

#从索引为0的位置开始,插入三个字符"g","h","j"

irb(main):082:0> arr.insert(0,"g","h","j")

=> ["g", "h", "j", "a", "f", "b", "c", "d", "e"]

1

2

3

4

5

6

7

8

9

(15)删除数组的元素,并返回被删除的元素

arr.pop 删除数组的最后一个元素,并返回被删除的元素

arr.pop(n) 删除数据的最后n个元素,并将这n个元素以数组的形式返回

arr.shift 删除数组的第一个元素,并返回被删除的元素

arr.shift(n) 删除数据的前n个元素,并将这n个元素以数组的形式返回

#定义一个数组,命名为arr1

irb(main):089:0> arr1 = %w{a b c d e}

=> ["a", "b", "c", "d", "e"]

#删除数组最后一个元素,并且返回被删除的元素

irb(main):090:0> arr1.pop

=> "e"

#再删除数组最后两个元素"c", "d",这俩元素会以数组的形式返回

irb(main):091:0> arr1.pop(2)

=> ["c", "d"]

#删除操作之后,arr1数组中的元素

irb(main):092:0> arr1

=> ["a", "b"]

#定义一个数组,命名为arr2

irb(main):094:0> arr2 = %w{f g h i j}

=> ["f", "g", "h", "i", "j"]

#删除数组第一个元素,并且返回被删除的元素

irb(main):095:0> arr2.shift

=> "f"

#再删除数组前两个元素"g", "h",这俩元素会以数组的形式返回

irb(main):096:0> arr2.shift(2)

=> ["g", "h"]

#目前arr2数组中的元素

irb(main):097:0> arr2

=> ["i", "j"]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

(16)reverse数组反转

arr.reverse 将数组中的值反转过来,不改变原先arr的值

arr.reverse! 会改变arr的值

irb(main):100:0> arr = [1,3,4,5,2]

=> [1, 3, 4, 5, 2]

irb(main):101:0> arr.reverse

=> [2, 5, 4, 3, 1]

#arr数组没有改变

irb(main):102:0> arr

=> [1, 3, 4, 5, 2]

irb(main):103:0> arr.reverse!

=> [2, 5, 4, 3, 1]

#arr数组的值也会被改变

irb(main):104:0> arr

=> [2, 5, 4, 3, 1]

1

2

3

4

5

6

7

8

9

10

11

12

(17)sort将数字升序排序,与reverse结合使用为降序排序

arr.sort 将arr数字升序排序(从小到大),不会改变数组本身的值

arr.sort! 会改变arr本身的值

irb(main):105:0> arr = [1,3,4,5,2]

=> [1, 3, 4, 5, 2]

irb(main):106:0> arr.sort

=> [1, 2, 3, 4, 5]

irb(main):107:0> arr.sort.reverse

=> [5, 4, 3, 2, 1]

————————————————

版权声明:本文为CSDN博主「猫宁一」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/shine_a/article/details/85227843

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 1,583评论 0 9
  • 原创声明 本文系作者辛苦码字所得,欢迎分享和转载,但请在明显位置注明作者的如下信息:笔名:来碗鸡蛋面简书主页:ht...
    来碗鸡蛋面阅读 3,176评论 0 4
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,102评论 0 18
  • 我最近总感觉胃不舒服,打嗝、胀气、恶心、憋得慌,嘴里特苦,感觉像含着苦瓜,吃点儿饭就撑的慌,心口窝到食管烧...
    幸福一生_e812阅读 2,066评论 5 12
  • 谁人不是耍猴者,哪个看客不是猴? 混沌世上真糊涂,铿锵锣下假自由。
    王呲花阅读 345评论 0 3