iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
0
自我挑戰組

滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 系列 第 24

陣列方法 <> 學不會就無法走出這個錯綜複雜的迷宮!路痴索隆表示:- 滿滿的紅寶石不拿嗎?

[Day24] 對不起我對陣列方法知道的太少了了!(跪)


今天這篇要向大家介紹一些超級常用的陣列方法(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" ]

結語

我想身為一個稱職的 Ruby 工程師,為了方便查詢,而把 Ruby API 放在 Chrome 書籤列最顯眼的地方是非常合理的,畢竟,

工欲善其事,必先RTFM」(Read The Fantastic Manual)

但就算看了文件,到了 CodewarLeetcode 上面解題時卻還是

自己對於 Ruby 的方法知道還是太少了!所以今天才想說應該要來複習陣列方法。

只是,陣列方法百百種,使用時機可說是千變萬化,這幾個只是常用的基礎,記得還是要看手冊喔!

如果還有其他常用的陣列方法,歡迎補充在下方留言,希望大家都能順利解題~


上一篇
empty? nil? blank? <> 聽說今天是滿月?戰鬥力爆表的月亮獅子變身!- 滿滿的紅寶石不拿嗎?
下一篇
例外處理 <> 白鬍子登場!就連海軍大將都無法擊倒的那個男人!- 滿滿的紅寶石不拿嗎?
系列文
滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言