Ruby 数组操作

简介:

Ruby语言的内置数据结构强大到让我震惊。下面展示了ruby数组的部分魔力 
1. & 
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ]   => [1, 3] 
取两个数组中都有的元素,但只取一个,不重复取。 
2. * 
[ 1, 2, 3 ] * 3  => [1, 2, 3, 1, 2, 3, 1, 2, 3] 
如果*号后面跟的是数字n,将原先数组中的所有元素重复n次,串联起来。相当于普通数字的乘法操作。 
[ 1, 2, 3 ] * "--"  => "1--2--3" 
如果*号后面跟的是字符串,也将返回字符串。 
3. + 
[ 1, 2, 3 ] + [1, 4, 5 ]   => [1, 2, 3, 1, 4, 5] 
简单的将两个数组连接在一起,不删除重复元素。 
4. - 
[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ]  => [3, 3, 5] 
从第一个数组中删除所有出现在第二给数组中的元素。 
5. << 
[ 1, 2 ] << "c" << "d" << [ 3, 4 ] << [3, 4]  => [1, 2, "c", "d", [3, 4], [3, 4]] 
在数组末尾添加新元素,也不管重复不重复。 
6. == 
[ "a", "c" ] == [ "a", "c", 7 ]   => false 
[ "a", "c", 7 ] == [ "a", "c", 7 ]  => true 
[ "a", "c", 7 ] == [ "a", "d", "f" ]  => false 
判断两个数组是否相等——数组相等的前提是,数组所有元素相等,数组大小也当然相等。 
7. | 
[ "a", "b", "c" ] | [ "c", "d", "a" ]   => ["a", "b", "c", "d"] 
取两个数组中所有元素组成的集合,删除重复元素。 
8. at 
a = [ "a", "b", "c", "d", "e" ] 
a.at(0)   => "a" 
a.at(-1)  => "e" 
a.at(5)  => nil 
取回某个索引中的元素,倒数第一个索引是-1,第二个是-2。 
9. clear 
a = [ "a", "b", "c", "d", "e" ] 
a.clear  => [] 
删除数组中的所有元素 
10. collect! 
a = [ "a", "b", "c", "d" ] 
a.collect! {|x| x + "$" }  => ["a$", "b$", "c$", "d$"] 
a   => ["a$", "b$", "c$", "d$"] 
对数组中的每一个元素进行遍历,block中对元素的操作将改变元素的值。 
11. compact 
[ "a", nil, "b", nil, "c", nil ].compact   => ["a", "b", "c"] 
删除数组中所有值为nil的元素,也即压缩数组。 
12. concat 
[ "a", "b" ].concat( ["c", "d"] )   => ["a", "b", "c", "d"] 
将第二个数组中的元素添加在第一个数组末尾,组成新数组。 
13. count 
[1, 2, 3, 4].count(3)   => 1 
[1, 2, 3,3, 4].count(3)  => 2 
[1, 2, 3, 4].count {|obj| obj > 2 }   => 2 
计算数组中等于某个值的元素有几个。 
14. delete 
a = [ "a", "b", "b", "b", "c" ] 
a.delete("b")   => "b" 
a # => ["a", "c"] 
a.delete("z")   => nil 
a.delete("z") { "not found" }   => "not found" 
删除数组中值为某个给定值的元素。 
15. each 
a = [ "a", "b", "c" ] 
a.each {|x| print x, " -- " } 
result : 
a -- b -- c -- 
遍历数组,打印元素值。 
16. each_index 
a = [ "a", "b", "c" ] 
a.each_index {|x| print x, " -- " } 
result : 
0 -- 1 -- 2 -- 
遍历数组,打印索引。 
17. empty? 
[].empty?   => true 
[ 1, 2, 3 ].empty?  => false 
判断数组是否为空。 
18. join 
[ "a", "b", "c" ].join  => "abc" 
[ "a", "b", "c" ].join("-")   => "a-b-c" 
将数组中的元素连接成字符串。如果给定参数,则在每个元素直接加入该参数。 
19. last 
[ "w", "x", "y", "z" ].last   => "z" 
[ "w", "x", "y", "z" ].last(1)  => ["z"] 
[ "w", "x", "y", "z" ].last(3)  => ["x", "y", "z"] 
如果不给定参数,取最后一个元素。如果给定参数n,取最后n个参数组成数组。 
20. length 
[ 1, nil, 3, nil, 5 ].length  => 5 
长度。空元素nil也算元素,计算在长度范围内。 
21. pop 
a = %w{ f r a b j o u s } 
a.pop   => "s" 
a   => ["f", "r", "a", "b", "j", "o", "u"] 
a.pop(3)   => ["j", "o", "u"] 
a   => ["f", "r", "a", "b"] 
返回删除了最后n个元素后的数组。 
22. push 
a = [ "a", "b", "c" ] 
a.push("d", "e", "f")  => ["a", "b", "c", "d", "e", "f"] 
在数组末尾插入元素。 
23. replace 
a = [ "a", "b", "c", "d", "e" ] 
a.replace([ "x", "y", "z" ])   => ["x", "y", "z"] 
a # => ["x", "y", "z"] 
用新数组替换旧数组。 
24. reverse 
[ "a", "b", "c" ].reverse   => ["c", "b", "a"] 
[ 1 ].reverse   => [1] 
反转数组。 
25. shift 
args = [ "-m", "-q", "-v", "filename" ] 
args.shift   => "-m" 
args.shift(2)  => ["-q", "-v"] 
args   => ["filename"] 
从数组头部删除n个元素,并将他们返回。若删除的是一个,则返回字符串。若删除两个以上元素,则返回这n个组成的新数组。原数组被改变。 
26. unshift 
a = [ "b", "c", "d" ] 
a.unshift("a")   => ["a", "b", "c", "d"] 
a.unshift(1, 2)   => [1, 2, "a", "b", "c", "d"] 
在头部加入元素,原数组元素往后移。 
27. shuffle 
[ 1, 2, 3, 4, 5, 1 ].shuffle   => [5, 1, 3, 4, 1, 2] 
将原数组随机打乱。 
28. sort 
a = [ "d", "a", "e", "c", "b" ] 
a.sort!   => ["a", "b", "c", "d", "e"] 
a  => ["a", "b", "c", "d", "e"] 
返回排序好的数组。 
29. values_at 
a = %w{ a b c d e f } 
a.values_at(1, 3, 5)  => ["b", "d", "f"] 
a.values_at(1, 3, 5, 7)  => ["b", "d", "f", nil] 
a.values_at(-1, -3, -5, -7)  => ["f", "d", "b", nil] 
a.values_at(1..3, 2...5)  => ["b", "c", "d", "c", "d", "e"] 
一次取回多个索引位置的值。 
30. uniq 
a = [ "a", "a", "b", "b", "c" ] 
a.uniq   => ["a", "b", "c"] 
返回数组中不同的元素。原数组不受影响。 
Ruby迭代器each、map、collect、inject 
说明: 
each——连续访问集合的所有元素 
collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。 
map——-同collect。 
inject——遍历集合中的各个元素,将各个元素累积成返回一个值。 
例子: 
def debug(arr) 
   puts '--------' 
   puts arr 
end 
h = [1,2,3,4,5] 
h1 = h 
h1.each{|v|puts sprintf('values is:%s',v)} 
h2 = h.collect{|x| [x,x*2]} 
debug h2 
h3 = h.map{|x| x*3 } 
debug h3 
h4 = h.inject{|sum,item| sum+item} 
debug h4    
结果: 
values is:1 
values is:2 
values is:3 
values is:4 
values is:5 
-------- 









10 
-------- 



12 
15 
-------- 
15 
names = %w[ruby rails java python cookoo firebody] 
等同于: 
names = ["ruby", "rails", "java", "python", "cookoo", "firebody"] 
arr = [1,2,3] 
1) arr2 = arr.each{|element| element = element * 2} #arr与arr2仍然都等于[1,2,3]   each返回原数组 遍历内对元素的更改不会保存 
2) arr2 = arr.map{|element| element = element* 2} #arr等于[1,2,3] arr2等于[2,4,6] map返回更改后的数组 遍历内对元素的更改不会保存 
3) arr2 = arr.map!{|element| element = element * 2} #arr与arr2都等于[2,4,6] map!返回更改后的数组 遍历对元素内的更改会保存 
collect 效果等于 map 
collect! 效果等于map! 
if ($ != jQuery) { $ = jQuery.noConflict(); } 




本文转自 nonono11 51CTO博客,原文链接:http://blog.51cto.com/abian/1337989,如需转载请自行联系原作者
相关文章
|
7月前
|
Ruby
|
7月前
|
Ruby 索引
|
7月前
|
存储 Java Ruby
|
索引 Ruby
【Ruby on Rails全栈课程】2.6 ruby的数据结构--数组(Array)
数组是一个集合,但是不仅仅是数字的集合,可以是任何对象(String、 Integer、 Fixnum、 Hash、 Symbol 等对象)的集合。数组的索引是从0开始的有序整数,可以通过正数索引或者负数索引来寻找数组中的值,数组中的值是有顺序的。
97 0
ruby数组与散列表
%q中定义的字符串,不加分号  如'hello'与%q(hello)  表示同一字符串 %w表示数组,不对变量进行替换;%W表示数组,对变量进行替换 散列表用=>序列进行分隔 irb(main):001:0> %w(fred wilma barney betty great\ gazoo)=>...
573 0
ruby数组操作
irb(main):005:0> [1,1,3,5] & [1,2,3]=> [1, 3]irb(main):006:0> [1,2,3] * 3=> [1, 2, 3, 1, 2, 3, 1, 2, 3]irb(main):007:0> [1,2,3 ] * "--"=> "1--2--3"irb...
552 0
|
7月前
|
Ruby
|
7月前
|
JSON 数据格式 Ruby