数组
1. 创建数组:
和其它很多编程语言一样,很容易创建一个数组,但要注意的是Ruby是一种弱类型的脚本语言,数组中各元素的类型可以互不相同,而且数组的长度可变:
代码如下 | 复制代码 |
arr = [“one”,”two”,”three”] OR arr = Array.new #an empty array arr = Array.new(5) #[nil, nil, nil, nil, nil] arr = Array.new(5,”hello”) #[”hello”, ”hello”, ”hello”, ”hello”, ”hello”] |
当创建一个数组时,如果其元素为string类型且使用单引号,而你又不想老输入单引号,那么我们可以使用下面的方法来创建(使用%W来创建用双引号括起来的字符串):
代码如下 | 复制代码 |
arr = %w( this is an array of strings) #使用空格作为元素的分隔符 |
2.通过索引存取数组的值:
在Ruby中,数组索引可以是正整数(从前到后,从0开始)也可以是负整数(从后到前,从-1开始)还可以是范围(Range):
代码如下 | 复制代码 |
arr = ['h','e','l','l','o',' ','w','o','r','l','d'] print arr[0,5] puts print arr[0..4] puts print arr[0...4] puts print arr[-5,5] --------Results-------- hello hello hell world
Note: arr[-5,5]:前一个整数-5表示开始的索引,后面一个整数5表示数量 |
3..复制数组:
当使用”=”将一个数组变量赋值给另一个数组变量时,这两个数组变量引用的仍然是同一个数组,修改其中一个数组的值,另一个也会修改。我们可以使用Clone方法复制一个新数组:
代码如下 | 复制代码 |
arr = [‘one’,’two’,’three’,] arr1= arr #arr和arr1引用的还是同一个数组,修改一个另一个也会修改 arr2=arr.clone #arr2是arr的一个新版本,修改arr2不影响arr |
4..比较数组大小:
当使用 <=> 来比较两个数组a1和a2时,有三种情况:
1. a1 小于 a2, 返回 -1
2. a1 等于 a2, 返回 0
3. a1 大于 a2, 返回 1
那么,数组是如何比大小的呢?
当两个数组进行比较时,会把两个数组相同索引(从0开始)上的值拿来比较,如 [0,10,20]<=> [0,20,20], 则会返回-1,因为当索引为1时,10<20;
另外,如果比较的两个数组的元素是字符串,那么就比较它们的ASCII;如果一个数组比另一个长且其它元素都相同,那么数组长的‘大’。
然而,如果一个短数组里面的一个元素比另一个长数组里面的同位置的元素大,则认为短数组‘大’。
代码如下 | 复制代码 |
arr1=[1,2,3,4,5] arr2=[1,2,3,4,5] arr3=[1,2,3,4] arr4=[1,2,3,5] arr5=[1000,2000,3000] arr6=[1,2] arr7=[2,1] arr8=["hello", "world"] arr9=["Hello", "World"]
p(arr1<=>arr2) # 0 p(arr3<=>arr1) # -1 p(arr4<=>arr3) # 1 p(arr5<=>arr4) # 1 p(arr7<=>arr6) # 1 p(arr8<=>arr7) # nil p(arr9<=>arr8) # -1 |
5.数组排序:
Sort方法使用比较操作符 <=> 来比较一个数组中邻近的元素的大小,但是这个不能比较一个数组中包含有nil的值的情况;
arr.sort{|a,b| a.to_s <=> b.to_s}
说明: 在这arr是一个数组对象,a和b代表相邻的两个元素。本方法使用了to_s方法把nil转换为一个空字符串,这样就可以对含有nil的数组进行排序了。此外,这个数组本身的值不会发生任何变在。
6.添加和删除数组元素:
向数组添加元素:
unshift:向数组头部添加数组元素
push: 向数组头部尾数组元素
<< : 向数组尾部添加一个数组元素
向数组删除元素:
shift: 从头部删除数组元素,并返回被删除的元素
pop: 从尾删除数组元素,并返回被删除的元素
ruby数组填充方法
12月17日 17:38作者:zool
手册
代码如下 | 复制代码 |
array.fill(obj) → array |
前三个方法都是将obj填充到array里, start 默认为0, length默认为self.length长度
后三个方法是将block里的返回值填充到array里。block接收到的是array的元素index值。
实例代码
a = [ "a", "b", "c", "d" ]
a.fill("x") #=> ["x", "x", "x", "x"]
#将数组里所有元素替换为"x"
a.fill("z", 2, 2) #=> ["x", "x", "z", "z"]
#从数组第[2]位元素开始,替换 2 次 "z"
a.fill("y", 0..1) #=> ["y", "y", "z", "z"]
#将数组[0]到[1]位的元素替换为"y"
a.fill {|i| i*i} #=> [0, 1, 4, 9]
#提供block方法, i为数组下标
a.fill(-2) {|i| i*i*i} #=> ['a', 'b', 8, 27]
#从数组第[-2]位开始运行block
#注意,ruby源码里的注释是错的
#a.fill(-2) {|i| i*i*i} #=> [0, 1, 8, 27]
#实际应用, 我要生成一个数字从1到50的数组
代码如下 | 复制代码 |
>> Array.new(50).fill {|i| i+=1 } => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50] |
也许Ruby数组中最有力量的运算可以从数学操作符中找到答案-它们能够从现在数组创建新的数组。例如,+操作符允许你由两个数组的连接创建一个新数组,而*操作符允许你复制或连接一个数组自身若干次。shirt_information= [14.5,
代码如下 | 复制代码 |
"Long", 32, 49.99] pant_information=[34,32,59.99] shirt_information + pant_information 结果为 [14.5, "Long", 32, 49.99, 34, 32, 59.99]结果为 [14.5, "Long", 32, 49.99,14.5, "Long", 32, 49.99] |
结果为
代码如下 | 复制代码 |
|