今天這篇要向大家介紹一些超級常用的陣列方法(Array Method),先來介紹居家旅行刷題解扣的必備:
- select
- map
- reduce
select
select
可以在陣列裡挑選出「符合條件」的元素。
a = %w{ a b c d e f }# 找出是母音的英文字母
a.select {|v| v =~ /[aeiou]/} #=> ["a", "e"]
%w
是另一種表示陣列的寫法,在這裡例子裡,設定了一個條件陣列[aeiou]
並透過 =~
來篩選出陣列a
與陣列[aeiou]
相符的元素。
map
map
是對這個陣列裡的每一個元素做某件事之後,再收集成一個新的陣列,通常會在 map
後面接的 Block 裡寫陣列中每一個元素要做的事。
a = [ "a", "b", "c", "d" ]# 在每個元素後面加上!
a.map {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
a #=> ["a", "b", "c", "d"]
b = [ 0, 1, 2 ,4]# 在每個元素後面加上 2 (要是數字)
b.map {|n| n + 2} #=> [ 2, 3, 4 ,6]
b #=> [ 0, 1, 2 ,4]
也可以使用 collect
!會得到一樣的結果。
另外提醒一點,除非是使用 map!
否則原本的陣列是不會改變的!
reduce
reduce
會幫我們把陣列中的每個元素收集起來,拿去運算,最後再告訴我們總計為多少,完全是熱心助人的模範生方法。
# 計算一個範圍的數字總和
(5..10).reduce(0) { |total, i| total + i } #=> 45
這邊我解釋一下,這裡假定初始值為 0,然後會依序把 5..10
這個範圍裡的 6 個數字: 5
, 6
, 7
, 8
, 9
, 10
傳進 Block 和初始值相加(因為在這裡是 +
),最後得出結果。
因此,也就是說 reduce
其實是把陣列裡的每個元素不斷地「互動」,再把每個互動結果全部搜集後,最終再回傳總計的一個方法
這個例子也可以這樣寫:
(5..10).reduce(:+) #=> 45
甚至字串也可以
["a","b","c"].reduce(:+) #=> "abc"
用 inject
也能做到同樣的事!
# Same using a block and inject
(5..10).inject { |sum, n| sum + n } #=> 45
# find the longest word
longest = %w{ cat sheep bear }.inject do |memo, word|
memo.length > word.length ? memo : word
end
longest #=> "sheep"
接著再來介紹其它也很常用的陣列方法!
slice
簡單來說,slice
就是會依照索引值(index) 來取出陣列裡相對應的元素。
a = [ "a", "b", "c", "d", "e" ]
a[2] + a[0] + a[1] #=> "cab"
a[6] #=> nil
a[1, 2] #=> [ "b", "c" ]
a[1..3] #=> [ "b", "c", "d" ]
a[4..7] #=> [ "e" ]
a[6..10] #=> nil
a[-3, 3] #=> [ "c", "d", "e" ]
# special cases
a[5] #=> nil
a[5, 1] #=> []
a[5..10] #=> []
join
join
可以幫我們把陣列裡的元素組合起來,想要的話,中間還可以插入我們指定的東西。
[ "a", "b", "c" ].join #=> "abc"
[ "a", "b", "c" ].join("-") #=> "a-b-c"
concat
concat
可以幫我們把兩個陣列接起來!
[ "a", "b" ].concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ]