【Ruby 學習筆記 — 05】陣列(Array)

寫在前頭

這個學習筆記系列作為我自己學習 Ruby 過程中筆記整理,Main purpose 是提供自己將來隨時 refer,而不是一個教程系列,加上本身有其他語言經驗因此很多概念和名詞不會多作解釋,因此不適合沒有任何程式基礎的讀者。Happy Coding !

陣列(Array)

陣列是一種基本的資料結構,大部分都叫 Array ,python中則是 list。
Ruby中的陣列可以含有許多不同的資料型態。

建立 Array

方式一: 使用 literal syntax 中括號直接建立,通常都是這樣寫

arr = []                  # 建立空陣列
arr = [1,'hello',5.5] # 建立陣列含有三個元素

方式二: 用 new 建立 Array class 的 instance
也可以帶有參數,第一個參數是陣列預設長度,第二個參數則是預設元素

arr = Array.new    # []
Array.new(3) # [nil, nil, nil]
Array.new(3, 1) # [1, 1, 1]

基本陣列操作

基本的查詢,新增

arr = [1,2,3,4]
arr[0] # 1 (查詢第一個元素)
arr[0] = 99 # [99,2,3,4] (第一個元素改成99)
arr << 100        # [99,2,3,4,100] (新增元素到最後)

合併陣列 (+)

arr1 = [1,2,3]
arr2 = [4,5,6]
arr1 + arr2 # [1,2,3,4,5,6]

陣列差異(-)

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ]  # [ 3, 3, 5 ]

使用method:

新增 :#append #push #prepend #unshift

append 同 push

prepend 同 unshift

arr = [1,1,1]
arr.push('push') # [1,1,1,'push'] (新增到陣列後面)
arr.unshift('unshift') # ['unshift',1,1,1,'push'] (新增到陣列前面)
arr.prepend('prepend') # ['prepend','unshift',1,1,1,'push'] (同上)

插入 : #insert

arr = [1,1,1]
arr.insert(1,3) # 在 index 1 的地方插入 3
arr # [1,3,1,1]

刪除 : #pop #shift #delete #delete_at

arr = [1,2,3,4,5]
arr.pop() # [1,2,3,4] (刪除最後一個元素)
arr.shift() # [2,3,4] (刪除第一個元素)
arr = [1,2,3,4,4,4,5]
arr.delete(4) # [1,2,3,5] (刪除所有指定元素)
arr.delete_at(1) # [1,3,5] (刪除指定位置的元素)

pop 跟 shift 都可以傳入參數,決定刪除頭 or 尾幾個元素


其他常用方法

#empty?

檢查陣列是否為空

[].empty?   # true

#include?

檢查陣列是否含有指定元素

arr = [1,2,3]
arr.include?(2) # true
arr.include?(5) # false

#count

計算陣列中有多少個指定元素

arr = [1,1,2,2,4,4,4,4,4]
arr.count(2) # 2
arr.count(4) # 5

#flatten

把巢狀陣列展開,變成一維陣列

arr = [[1,2,3],4,[5,[6,7,8]]]
arr.flatten # [1, 2, 3, 4, 5, 6, 7, 8]

#slice

其實跟直接中括號是一樣的
不過在使用 #slice! 時會修改原陣列將選取的元素刪除

arr = [1,2,3,4,5,6,7]
arr.slice(1)             # 2
arr[1] # 2
arr.slice(1,4)           # [2,3,4]
arr[1,4] # [2,3,4]
arr.slice(1..4)          # [2,3,4,5]
arr[1..4] # [2,3,4,5]

#sort

排序陣列,Ruby 使用 quick sort

arr = [3,4,8,1,5,0,7,2,6]
arr.sort # [0,1,2,3,4,5,6,7,8]

#select

給定一個程式碼區塊 (block) ,依序將陣列中元素傳入,回傳所有結果為 true的元素組成的陣列。

[1,2,3,4,5,6].select { |num| num.odd? }    # [1,3,5]
[1,2,3,4,5,6].select { |num| num > 3 } # [4,5,6]

#sample

隨機取樣

arr = [1,2,3,4,5,6,7,8,9]
arr.sample # 5
arr.sample(3) # [1,3,8]

#shuffle

洗牌,使用 shuffle! 才會修改原陣列

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr.shuffle! # [8, 1, 2, 6, 3, 7, 4, 9, 5]

#split #join

split 是字串的方法,特別提一下,將字串分割成陣列
join 則將陣列合併成一個字串
可傳入分割字元

'abcde'.split('')              # ['a','b','c','d','e']
['a','b','c','d','e'].join # 'abcde'

#uniq

去掉重複值

arr = [1,1,1,3,3,3,5,5,5,5]
arr.uniq # [1,3,5]

#max #min #minmax

找陣列最大值,最小值,和一次都傳回的方法

arr = [1,2,3,4,5,6]
arr.max # 6
arr.min # 1
arr.minmax # [1,6]

#zip

將多個陣列以 index 對 index 的方式合併成一個巢狀陣列
長度由原陣列決定
傳入的陣列若比原陣列短,則會填入 nil

arr = [1,2,3]
a = [4,5,6,7]
b = [8,9]
arr.zip(a,b)    # [1, 4, 8], [2, 5, 9], [3, 6, nil]]

Reference

Ruby-Doc — Array

end