Ruby基础之Array,String and Hash

Posted on Jul 21, 2013

##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方法会从接收者与实参所指定的数组中逐项获取数据,每次调用代码块内容。