免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 117717 | 回复: 14
打印 上一主题 下一主题

ruby扫盲之数组十二问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-07 11:50 |只看该作者 |倒序浏览
1. 如何创建数组?

最简单的,x=[]将创建一个空数组:

irb(main):004:0> x = []
=> []


另外还可以使用标准的new方法,任何数组都是Array类的实例。

irb(main):001:0> x = Array.new
=> []

irb(main):002:0> x = Array.new(3)
=> [nil, nil, nil]

irb(main):003:0> x = Array.new(3,"a")
=> ["a", "a", "a"]


上述第一个创建空数组,第二个创建预设SIZE的数组,第三个创建预设SIZE和值的数组。
跟Hash一样,第三种方法填充的预设值,都指向同一个目标。
任何一个位置的目标改变了,都影响所有元素的值:

irb(main):005:0> x = Array.new(3,"a")
=> ["a", "a", "a"]

irb(main):006:0> x[0] << "b"
=> "ab"

irb(main):007:0> x
=> ["ab", "ab", "ab"]


创建的数组,每个元素都是唯一目标,要这样做:

irb(main):008:0> x = Array.new(3) do |e| e = "a" end
=> ["a", "a", "a"]

irb(main):009:0> x[0] << "b"
=> "ab"

irb(main):010:0> x
=> ["ab", "a", "a"]


当然还可以如下创建数组:

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

irb(main):013:0> x = Array[1,2,3]
=> [1, 2, 3]


不过很少使用,不如x=[1,2,3]来的简洁方便。


2. 如何访问数组?

使用数组下标:

irb(main):014:0> x = [3,2,1,4]
=> [3, 2, 1, 4]

irb(main):015:0> x[0]
=> 3

irb(main):016:0> x[-1]
=> 4


0表示第一个元素,-1表示最后一个元素,其他类推。

还有first和last方法:

irb(main):017:0> x.first
=> 3
irb(main):018:0> x.last
=> 4


first和last可以带一个整数参数,表示返回首尾多少个元素。

遍历数组使用each方法:

irb(main):024:0> x.each do |s| puts s end
1
2
3
=> [1, 2, 3]



3. 数组的slice?

数组的slice可以对数组切片,返回指定位置和长度的片段。

irb(main):021:0> x[0,2]
=> [3, 2]

irb(main):022:0> x[0..2]
=> [3, 2, 1]

irb(main):023:0> x[0...2]
=> [3, 2]


第一个表述从0位置开始切片,长度为2,返回2个元素。
第二个表示从0位置开始切片,到2位置结束,返回3个元素。
第三个表示从0位置开始切片,到2位置结束,但是不包括最后一位,返回2个元素。


4. 如何修改数组?

数组有push和<<方法,表示添加元素到数组尾部:

irb(main):024:0> x = [3,2,1,4]
=> [3, 2, 1, 4]

irb(main):025:0> x.push(5)
=> [3, 2, 1, 4, 5]

irb(main):026:0> x << 6
=> [3, 2, 1, 4, 5, 6]


pop方法表示从尾部删除元素,shift表示从首部删除元素:

irb(main):027:0> x.pop
=> 6

irb(main):028:0> x.shift
=> 3


对应的有unshift方法,表示从首部添加元素:

irb(main):029:0> x.unshift(0)
=> [0, 2, 1, 4, 5]


数组的insert方法可以在指定位置插入元素:

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

irb(main):054:0> x.insert(1,5)
=> [1, 5, 2, 3]


当然delete和delete_at方法可以删除对应的元素。
delete_at的参数是数组索引:

irb(main):021:0> x.delete_at(1)
=> 5



5. 数组的加减操作?

ruby很灵活,任何目标都可以定义自己的方法。
数组就定义了加减方法(当然还有乘除,不过很少使用)。

irb(main):031:0* x = [1,2,3]
=> [1, 2, 3]

irb(main):032:0> y = [4,5,6]
=> [4, 5, 6]

irb(main):033:0> z = x + y
=> [1, 2, 3, 4, 5, 6]

irb(main):034:0> z - x
=> [4, 5, 6]


所谓加就是把两个数组合并起来,所谓减就是把相同的元素排除掉。
而且这个减似乎不在意元素顺序:

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

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

irb(main):045:0> x-a
=> []



6. 求唯一数组?

在ruby里这个很方便,用uniq方法:

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

irb(main):047:0> x.uniq
=> [1, 2, 3]


当然x.uniq!这样加个叹号,表示毁坏性方法,不返回而是直接改变x目标自身。


7. 数组的比较?

可以直接用==进行比较:

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

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

irb(main):050:0> x == y
=> false

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

irb(main):052:0> x == a
=> true



8. 数组的类型转换?

数组可以转换成串,使用to_s或者join方法:

irb(main):001:0> x=[1,2,3,4]
=> [1, 2, 3, 4]

irb(main):002:0> x.to_s
=> "1234"

irb(main):003:0> x.join "-"
=> "1-2-3-4"


串也可以转换成数组:

irb(main):012:0> str="1 2 3 4"
=> "1 2 3 4"

irb(main):013:0> str.to_a
=> ["1 2 3 4"]


这可能不是你想要的,那么执行:

irb(main):018:0> str.split(/ /).map {|s| s.to_i}
=> [1, 2, 3, 4]


Hash可以直接转换成二维数组:

irb(main):010:0> hash={1=>2,3=>4}
=> {1=>2, 3=>4}

irb(main):011:0> hash.to_a
=> [[1, 2], [3, 4]]


数组可以转换成hash,见我前一篇帖子。


9. 如何查找数组元素?

irb(main):034:0> x = [3,2,1,4,4]
=> [3, 2, 1, 4, 4]

irb(main):032:0> x.include? 4
=> true

irb(main):035:0> x.find do |s| s == 4 end
=> 4

irb(main):036:0> x.select do |s| s == 4 end
=> [4, 4]


include?判断是否包含该元素,返回true或false。
find找出符合条件的一个元素,返回该元素。
select找出符合条件的所有元素,返回结果也是数组。


10. 数组的排序?

使用sort:

irb(main):049:0> x = [3,1,4,0,1]
=> [3, 1, 4, 0, 1]

irb(main):050:0> x.sort
=> [0, 1, 1, 3, 4]

irb(main):052:0> x.sort.reverse
=> [4, 3, 1, 1, 0]


还有sort_by方法,接受一个block作为参数,按照指定规则进行排序。


11. 其他实用数组方法?

展开数组:

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

irb(main):026:0> x.flatten
=> [1, 2, 3, 0, 1, 2]


清空数组:

irb(main):027:0> x.clear
=> []


替换数组:

irb(main):028:0> x.replace [3,2,1]
=> [3, 2, 1]


合并数组:

irb(main):030:0> x.concat [1,2,3]
=> [3, 2, 1, 1, 2, 3]



12. 数组的inject方法?

irb(main):044:0> x = [1,2,3,4]
=> [1, 2, 3, 4]

irb(main):045:0> x.inject(0){|sum, item| sum += item}  
=> 10


inject的参数0表示初始化sum,item表示遍历每一个元素,在block里不断自加,最后返回累计加值。

irb(main):047:0> x.inject([]){|new, item| new << -item}   
=> [-1, -2, -3, -4]


上述inject作用,表示取数组的每个元素的负值,返回一个新数组。当然用map更简洁:

irb(main):048:0> x.map {|item| -item}
=> [-1, -2, -3, -4]


map的item也表示遍历数组元素,对元素进行计算后,返回一个结果数组。

论坛徽章:
0
2 [报告]
发表于 2010-12-07 12:24 |只看该作者
嘿嘿嘿嘿,支持祖儿。

论坛徽章:
0
3 [报告]
发表于 2010-12-07 14:23 |只看该作者
赞!不过一般都称 object 为对象而非”目标“的吧?
我还想到一个:

  1. # 求交集
  2. ruby-1.9.2-head > [1,2,3] & [2,3,4]
  3. => [2, 3]
  4. # 求并集
  5. ruby-1.9.2-head > [1,2,3] | [2,3,4]
  6. => [1, 2, 3, 4]
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-02-22 19:15 |只看该作者
学习了。

论坛徽章:
0
5 [报告]
发表于 2011-02-22 19:16 |只看该作者
  1. 挺好,呵呵
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-08-02 23:09 |只看该作者
学习了。

论坛徽章:
0
7 [报告]
发表于 2011-08-14 11:14 |只看该作者
祖儿好久没见到。

论坛徽章:
0
8 [报告]
发表于 2011-08-16 20:05 |只看该作者
祖儿好久没见到。
2gua 发表于 2011-08-14 11:14



    最近忙东忙西,用Java去了。fk领导。

论坛徽章:
0
9 [报告]
发表于 2011-08-18 22:36 |只看该作者
回复 8# zuerrong


    哦?我也是Java出身咯。

论坛徽章:
0
10 [报告]
发表于 2011-11-17 03:54 |只看该作者
学习数组。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP