1. 如何創建數組?
最簡單的,x=[]將創建一個空數組:
=> []
另外還可以使用標准的new方法,任何數組都是Array類的實例。
=> []
irb(main):002:0> x = Array.new(3)
=> [nil, nil, nil]
irb(main):003:0> x = Array.new(3,"a")
=> ["a", "a", "a"]
上述第一個創建空數組,第二個創建預設SIZE的數組,第三個創建預設SIZE和值的數組。
跟Hash一樣,第三種方法填充的預設值,都指向同一個目標。
任何一個位置的目標改變了,都影響所有元素的值:
=> ["a", "a", "a"]
irb(main):006:0> x[0] << "b"
=> "ab"
irb(main):007:0> x
=> ["ab", "ab", "ab"]
創建的數組,每個元素都是唯一目標,要這樣做:
=> ["a", "a", "a"]
irb(main):009:0> x[0] << "b"
=> "ab"
irb(main):010:0> x
=> ["ab", "a", "a"]
當然還可以如下創建數組:
=> [1, 2, 3]
irb(main):013:0> x = Array[1,2,3]
=> [1, 2, 3]
不過很少使用,不如x=[1,2,3]來的簡潔方便。
2. 如何訪問數組?
使用數組下標:
=> [3, 2, 1, 4]
irb(main):015:0> x[0]
=> 3
irb(main):016:0> x[-1]
=> 4
0表示第一個元素,-1表示最后一個元素,其他類推。
還有first和last方法:
=> 3
irb(main):018:0> x.last
=> 4
first和last可以帶一個整數參數,表示返回首尾多少個元素。
遍歷數組使用each方法:
1
2
3
=> [1, 2, 3]
3. 數組的slice?
數組的slice可以對數組切片,返回指定位置和長度的片段。
=> [3, 2]
irb(main):022:0> x[0..2]
=> [3, 2, 1]
irb(main):023:0> x[0...2]
=> [3, 2]
第一個表述從0位置開始切片,長度為2,返回2個元素。
第二個表示從0位置開始切片,到2位置結束,返回3個元素。
第三個表示從0位置開始切片,到2位置結束,但是不包括最后一位,返回2個元素。
4. 如何修改數組?
數組有push和<<方法,表示添加元素到數組尾部:
=> [3, 2, 1, 4]
irb(main):025:0> x.push(5)
=> [3, 2, 1, 4, 5]
irb(main):026:0> x << 6
=> [3, 2, 1, 4, 5, 6]
pop方法表示從尾部刪除元素,shift表示從首部刪除元素:
=> 6
irb(main):028:0> x.shift
=> 3
對應的有unshift方法,表示從首部添加元素:
=> [0, 2, 1, 4, 5]
數組的insert方法可以在指定位置插入元素:
=> [1, 2, 3]
irb(main):054:0> x.insert(1,5)
=> [1, 5, 2, 3]
當然delete和delete_at方法可以刪除對應的元素。
delete_at的參數是數組索引:
=> 5
5. 數組的加減操作?
ruby很靈活,任何目標都可以定義自己的方法。
數組就定義了加減方法(當然還有乘除,不過很少使用)。
=> [1, 2, 3]
irb(main):032:0> y = [4,5,6]
=> [4, 5, 6]
irb(main):033:0> z = x + y
=> [1, 2, 3, 4, 5, 6]
irb(main):034:0> z - x
=> [4, 5, 6]
所謂加就是把兩個數組合並起來,所謂減就是把相同的元素排除掉。
而且這個減似乎不在意元素順序:
=> [1, 2, 3]
irb(main):044:0> a
=> [3, 2, 1]
irb(main):045:0> x-a
=> []
6. 求唯一數組?
在ruby里這個很方便,用uniq方法:
=> [1, 2, 3, 3, 2, 1]
irb(main):047:0> x.uniq
=> [1, 2, 3]
當然x.uniq!這樣加個嘆號,表示毀壞性方法,不返回而是直接改變x目標自身。
7. 數組的比較?
可以直接用==進行比較:
=> [1, 2, 3]
irb(main):049:0> y = [3,2,1]
=> [3, 2, 1]
irb(main):050:0> x == y
=> false
irb(main):051:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):052:0> x == a
=> true
8. 數組的類型轉換?
數組可以轉換成串,使用to_s或者join方法:
=> [1, 2, 3, 4]
irb(main):002:0> x.to_s
=> "1234"
irb(main):003:0> x.join "-"
=> "1-2-3-4"
串也可以轉換成數組:
=> "1 2 3 4"
irb(main):013:0> str.to_a
=> ["1 2 3 4"]
這可能不是你想要的,那么執行:
=> [1, 2, 3, 4]
Hash可以直接轉換成二維數組:
=> {1=>2, 3=>4}
irb(main):011:0> hash.to_a
=> [[1, 2], [3, 4]]
數組可以轉換成hash,見我前一篇帖子。
9. 如何查找數組元素?
=> [3, 2, 1, 4, 4]
irb(main):032:0> x.include? 4
=> true
irb(main):035:0> x.find do |s| s == 4 end
=> 4
irb(main):036:0> x.select do |s| s == 4 end
=> [4, 4]
include?判斷是否包含該元素,返回true或false。
find找出符合條件的一個元素,返回該元素。
select找出符合條件的所有元素,返回結果也是數組。
10. 數組的排序?
使用sort:
=> [3, 1, 4, 0, 1]
irb(main):050:0> x.sort
=> [0, 1, 1, 3, 4]
irb(main):052:0> x.sort.reverse
=> [4, 3, 1, 1, 0]
還有sort_by方法,接受一個block作為參數,按照指定規則進行排序。
11. 其他實用數組方法?
展開數組:
=> [1, 2, 3, [0, 1, 2]]
irb(main):026:0> x.flatten
=> [1, 2, 3, 0, 1, 2]
清空數組:
=> []
替換數組:
=> [3, 2, 1]
合並數組:
=> [3, 2, 1, 1, 2, 3]
12. 數組的inject方法?
=> [1, 2, 3, 4]
irb(main):045:0> x.inject(0){|sum, item| sum += item}
=> 10
inject的參數0表示初始化sum,item表示遍歷每一個元素,在block里不斷自加,最后返回累計加值。
=> [-1, -2, -3, -4]
上述inject作用,表示取數組的每個元素的負值,返回一個新數組。當然用map更簡潔:
=> [-1, -2, -3, -4]
map的item也表示遍歷數組元素,對元素進行計算后,返回一個結果數組。
原文鏈接地址 http://bbs.chinaunix.net/thread-1828498-1-1.html