1. 數組的定義
數組是許多指向對象的引用按順序排列的數據結構。
數組中保存的是”指向對象的引用“,而不是對象本身。
2. 數組的創建
例1
a = 1 b = "str" #數組不一定都是同一類型 c = [a, b, 3, "abcdef"] #=> [1, "str", 3, "abcdef"] #數組可以嵌套使用 d = [a, c, [1, 2, 3]] #=> [1,[1, "str", 3, "abcdef"], [1, 2, 3]]
3. 數組的索引
數組的各個元素按順序被賦予了從0開始的編號,可使用這些編號和索引運算符[]對訪問對象進行操作。
例2
p c[0] p c[1] p c[2] p c[3] #如果訪問的索引值指向的元素不存在,則返回nil
p c[4] p d[2] #輸出結果 #1 #"str" #3 #"abcdef" #nil #[1, 2, 3]
負索引
負索引的存在,在Ruby中非常具有代表性。
Ruby中的數組對象的索引值是負數,是從末尾開始反向的編號所表示的元素。
數組的最后一個元素的編號是-1,在它前面的一個元素編號則是-2。
例3
p c[-1] p c[-2] #比最前面的元素還要前面,在數組范圍之外 p c[-5] #輸出結果 #abcdef #3 #nil
帶有長度的索引
例4
p c[1, 2] p c[1, 3] p c[1, 4] #利用負索引進行訪問倒數兩個索引值指向的元素
p c[-2,2] #對范圍外進行訪問
p c[4,2] #輸出結果 #["str", 3] #["str", 3, "abcdef"] #["str", 3, "abcdef"] #[3, "abcdef"] #[]
表示范圍的索引
..表示包含末端的范圍
...表示不包含末端的范圍
例5
#包含末端的范圍 p c[0..1] #不包含末端的范圍 p c[0...1] p c[-2..-1] #負索引組合,-2表示倒數編號,3表示正數編號 p c[-2..3] p c[-2...3] p c[4..5] #輸出結果 [1, "str"] [1] [3, "abcdef"] [3, "abcdef"] [3] []
索引賦值
使用索引值可以對數組的內容進行替換。
例6
a = [1, 2] p a a[0] = 3 p a #能夠對超過數組長度的位置進行賦值,此時數組會被自動延長,空白索引部分用nil填充 a[4] = "4" p a a[0, 3] = 'a', 'b', 'c' p a #當指定的元素個數比原數組的元素個數多時,數組會被加長並代入 a[0, 3] = 'a', 'b', 'c', 'd' p a a[1..2] = 1, 2 p a a[0, 2] = "?" p a a[0..2] = "A" p a a[-1] = "Z" p a #輸出結果 #[1, 2] #[3, 2] #[3, 2, nil, nil, "4"] #["a", "b", "c", nil, "4"] #["a", "b", "c", "d", nil, "4"] #["a", 1, 2, "d", nil, "4"] #["?", 2, "d", nil, "4"] #["A", nil, "4"] #["A", nil, "Z"]
4. 數組的比較
例7
array1 = [1, 2, "str"] array2 = [1, 2, "str"] p array1 === array2 #=>true array = ["str", 1, 2] p array === [1, 2, "str", "extra"] #=>false
5. 數組的各種各樣的方法
例8
array = ["a", "b", "c"] #輸出數組的長度 p array.length #輸出數組的元素個數(即長度) p array.size #array的元素copy p array *=2 #是否包含c p array.include? "c" #對數組進行排序,生成新的數組,並不改變原來的array數組 p array.sort p array #消除重復元素,並不改變原來的array數組 p array.uniq p array #消除重復元素,並更新原來的array數組 array.uniq! p array #輸出結果
#3 #3 #["a", "b", "c", "a", "b", "c"] #true #["a", "a", "b", "b", "c", "c"] #["a", "b", "c", "a", "b", "c"] #["a", "b", "c"] #["a", "b", "c", "a", "b", "c"] #["a", "b", "c"]
6. 帶有代碼塊的方法和迭代
對帶有代碼塊的方法的調用進行編程時可以用do ... end 與 花括號{}。 do ... end 和花括號{}的區別僅僅在於結合強度而已。
數組對象擁有很多帶有代碼塊的方法,其中很多事對反復操作的抽象化,成為迭代方法。其中最具代表性的是each。
例9
array = ["a", "b", "c"] array.each do |item| print item + "" end #輸出結果 #abc
7. 帶有序數的反復操作
each_with_index是each的一種變體,能夠同時獲取數組元素和其索引值
例10
array = ["a", "b", "c"] array.each_with_index do |item, index| p [item, index] end #輸出結果 #["a", 0] #["b", 1] #["c", 2]
映射(Map)
例11-1
acids = ["Adenin", "Thymine", "Guanine", "Cytosine"]
sign = acids.map{|acid| acid[0, 1]}
p sign
#輸出結果
["A", "T", "G", "C"]
例11-2
acids = ["Adenin", "Thymine", "Guanine", "Cytosine"]
#對acids內的元素分別進行小寫轉為大寫,a為臨時變量
sign = acids.map{|a| a.upcase}
p sign
#輸出結果
#["ADENIN", "THYMINE", "GUANINE", "CYTOSINE"]
8. 排序
例12
array = ["73", "2", "5", "1999", "53"]
#按照默認的字符串排序
p array.sort
#轉化為數值后排序
p array.sort{|x,y| x.to_i <=> y.to_i}
#輸出結果
#["1999", "2", "5", "53", "73"]
#["2", "5", "53", "73", "1999"]
9. 選擇
將代碼塊中的返回值為真的元素取出,組成新的數組並返回
例:students.select{|person| person.grade == 3}
