數組
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轉換為一個Null 字元串,這樣就可以對含有nil的數組進行排序了。此外,這個數組本身的值不會發生任何變在。
6.添加和刪除數組元素:
向數組添加元素:
unshift:向數組頭部添加數組元素
push: 向數組頭部尾數組元素
<< : 向數組尾部添加一個數組元素
向數組刪除元素:
shift: 從頭部刪除數組元素,並返回被刪除的元素
pop: 從尾刪除數組元素,並返回被刪除的元素
ruby數組填充方法
12月17日 17:38作者:zool
手冊
代碼如下 |
複製代碼 |
array.fill(obj) → array array.fill(obj, start [, length]) → array array.fill(obj, range ) → array array.fill {|index| block } → array array.fill(start [, length] ) {|index| block } → array array.fill(range) {|index| block } → 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]
|
結果為