【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] # 2arr.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]]