iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

陣列在ruby中是一個基礎的資料結構,在ruby中,我們可以把不同型別的資料放在同一個陣列裡面

Array

為什麼要用陣列?
可以將字串、數字… 等其他值集中放在一起,一次傳給設定的方法去執行

建立 Array

  1. 使用中括號直接建立
    list = [1, 2, 3, 4, 5, "aa"]
  2. 使用Array類別建立
arr = Array.new    
# []
Array.new(3, 100)    
# [100, 100, 100]
  • 陣列開始值為0
heroes = ['孫悟空', '魯夫', '宇智波佐助', '⼀拳超人', '流川楓', '⿊崎一護', '劍⼼'];
puts heroes[0] # 印出 孫悟空
puts heroes[1] # 印出 魯夫
puts heroes[-1] # 印出 劍⼼
puts heroes[-2] # 印出 ⿊崎一護
   
puts heroes.first # 印出 孫悟空 
puts heroes.last # 印出 劍心

puts heroes.length # 印出 7
  • heroes << "yen":將"yen"加入陣列heroes的最末端
  • heroes.push("RoR") :將"RoR"加入陣列heroes的最末端
heroes << '漩渦鳴⼈' # 在最後⾯加⼀個⼈
puts heroes.length # 印出 8

heroes.push('布羅利')
puts heroes.length # 印出 9

傳參數給 Block

  • 會發現不管在 list.map { |i| i * 2 } 或 list.each do |num| p num * 2 end 的 Block 中,那個 |i| 和 |num| 是什麼?Block 中包住 i 和 num 的 | 唸做 pipe,中間的 i 與 num 是匿名函數的參數,稱作 token,其實是 Block 範圍裡的區域變數,離開 Block 之後就會失效了。

常見的Ruby陣列方法

  • map: 對集合裡的每個元素進行運算,並收集成一個新的集合 (=collect)
list = [1, 2, 3, 4, 5]
p list.map {|x| x*2} 
# 變數 x 只有在 Block 裡有效,會產生 [2, 4, 6, 8, 10]
  • select: 挑選符合條件的元素成為一個新的陣列 (同意詞:filter) (反意詞:reject)
p (1..10).select { |x| x < 5 }
# 印出 [1, 2, 3, 4]
  • reduce(歸納): 對集合裡的每個元素進行運算,並將所有的運算結果歸納成一個單一結果
p (1..10).reduce { |sum, n| sum + n }
# 印出 55

p (1..10).sum
#55
  • 去除nil: compact
list = [1, 3, 4, 1, 7, nil, 7]
p list.compact
  • 去除重複的數字: uniq
arr = [2, 5, 6, 556, 6, 6, 8, 9, 0, 123, 556]
arr.uniq #=> [2, 5, 6, 556, 8, 9, 0, 123]
  • 把陣列的數字從小排到大: sort
list = [3, 1, 7, 4]
p list.sort [1, 3, 4, 7]
  • 多個方法一起用
list = [1, 3, 4, 1, 7, nil, 7] #要去除重複, nil, 且由小到大
p list.compact.uniq.sort

範圍

使用小數點表示

  • ..1..10 表示從 1 開始且++有包括10。

  • ...1...10 表示從 1 開始++但不包括10。

  • to_a : 轉成陣列

p (1..5).to_a  # 印出 1 到 10 並轉成陣列
# [1, 2, 3, 4, 5]
p (11...15).to_a
# [11, 12, 13, 14]

練習:

  1. 印出 1 ~ 100 之間所有的單數
  2. 計算 1 ~ 100 的總和
  3. 印出 5 個小於 100 且不重複的亂數
#1
p(1..100).select{|x| x%2==1}
p(1..100).select{|x| x.odd?}

#2
p(1..100).reduce {|sum,x| sum+x}
p(1..100).sum

#3
p(1..100).to_a.shuffle.first(5)
p(1..100).to_a.sample(5)
#shuffle 洗牌
#first 返回最前面的element

參考資料: https://medium.com/%E9%B3%A5-crl/ruby-%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-04-%E9%99%A3%E5%88%97-array-ea2f7c8f92af


上一篇
[Day 21] Ruby: 迴圈
下一篇
[Day 23] Ruby : 陣列方法整理
系列文
30天從零到有,帶你進入程式的世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言