Ruby基础之Array,String and Hash
##Array
数组通常都是同种元素的集合,元素可以为单个的变量,如数值或者字符串,但是也可以为数组和Hash等复杂对象。
###数组表示矩阵
其实数组可以用来表示矩阵,矩阵可以被看作数组的数组,也就是每个数组元素都是数组。三行三列的矩阵可以表示为:
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
“5”的位置则是: a[1][1]
###数组初始化陷阱
初始化数组时,若要使用数组对象或Hash对象作为初始值的元素时必须非常小心,否则便会陷入陷阱当中,如下所示:
a = Array.new(3, [0, 0, 0])
这样看起来初始化结果是[[0, 0, 0], [0, 0, 0], [0, 0, 0]]。但是实则不是。
这样,当只想改动第二行第二个元素时,每一行的第二个元素都会修改,不是预期的结果: a = Array.new(3, [0, 0, 0]) a[1][1] = 2 p a #=>[[0, 2, 0], [0, 2, 0], [0, 2, 0]]
解决办法如下: a = Array.new(3) { [0, 0, 0] } p[1][1] = 2 p a #=>[[0, 0 , 0], [0, 2, 0], [0, 0, 0]]
针对索引值初始化不同的内容: a = Array.new(5) { |i| i+1 } p a #=>[1, 2, 3, 4, 5]
###并行处理多个数组值
有时候可能会用到将多个数组的同一位置的元素一并处理。如下:
array1 = [1, 2, 3, 4, 5]
array2 = [10, 20, 30, 40, 50]
array3 = [100, 200, 300, 400, 500]
i = 0
result = []
while i < array1.length
result << array1[i] + array2[i] + array3[i]
i += 1
end
p result #=>[111, 222, 333, 444, 555]
如果使用zip方法则更简洁:
array1 = [1, 2, 3, 4, 5]
array2 = [10, 20, 30, 40, 50]
array3 = [100, 200, 300, 400, 500]
i = 0
result = []
array1.zip(array2, array3) { |a, b, c|
result << a + b + c
i += 1
}
p result #=>[111, 222, 333, 444, 555]
zip方法会从接收者与实参所指定的数组中逐项获取数据,每次调用代码块内容。