陣列(Array)
建立陣列方式:
arr = Array.new() # []
arr = Array.new([repeat], [item])
# Array literal notation
arr = [ ] # []
# 建立帶值陣列
arr = Array.new(3,"Hello") # ["Hello","Hello","Hello"]
arr = [*1..52] # [1, 2, 3, ..., 51, 52]
arr = ["ruby", "is", "good"] # ["ruby","is","good"]
arr = %w(ruby is good) # 如果陣列的元素都是字串,可以使用 %w ,回傳["ruby", "is", "good"]
arr = %W(#{food} is good) # 大寫的 %W
陣列取用
arr = ["cat", "dog", "bird"]
arr[0] # 取陣列中第一個,["cat"]
arr[-1] # 取陣列中最後一個,["bird"]
arr[0..2] # 取陣列中第一個到第三個,["cat", "dog", "bird"]
arr.at(1) # 根據索引值,["dog"]
arr.fetch(100, "fish") # 根據索引值,如果無該元素,則以第二個參數為預設值,["fish"]
arr.first # 提取第一個,["cat"]
arr.last # 提取最後一個,["bird"]
arr.drop(2) # 刪除前兩個陣列元素後再提取,["bird"]
arr.slice(1,2) # 從第 i 個元素開始取 j 個元素,["dog","bird"]
陣列操作
# 為陣列添加元素(會改變原本的 arr)
arr = ["cat", "dog", "bird"]
arr << "apple" # 添加在最後面,["cat", "dog", "bird","apple"],concatenation operator
arr.push("fish") # 添加在最後面,["cat", "dog", "bird","fish"]
arr += ["ice-cream", "sugar"] # 添加在最後面,["cat", "dog", "bird", "ice-cream", "sugar"]
arr.unshfit(3) # 添加在最前面,[3, "cat", "dog", "bird"]
arr.insert(1,"carrot") # 插入指定位置,["cat","carrot", "dog", "bird"]
# 為陣列刪除元素(會改變原本的 arr)
arr = ["cat", "dog", "bird"]
arr -= ["dog", "bird"] # 刪除指定元素,["cat"]
arr.pop # 刪除最後一個元素
arr.shift # 刪除第一個元素
# 其他方法
arr.length # 回傳陣列元素數目
arr.count # 回傳陣列元素數目
arr.count("cat") # 回傳陣列元素為 cat 的數目
arr.include?("apple") # 陣列是否包含該元素
arr.sort! # 根據陣列內容排序
arr.sort! { |a, b| a <=> b } # 如果要換排序方式可以改成 b <=> a
[*1..52].select { |i| i.odd? } # 選擇陣列中的元素
[*1..52].sample 5 # 從陣列中隨機抽取 5 個元素
[*1..52].shuffle # 將陣列元素順序打亂
輸出元素
arr.inspect
arr.to_s
arr.to_h # 陣列轉雜湊
Array.to_h陣列轉雜湊(array to hash)
[[:cat, :dog], [1, 2]].to_h # => {:cat => :dog, 1 => 2}
實做看看會讓自己更印象深刻
把陣列 [1, 2, 3, 4, 5] 變成 [1, 3, 5, 7, 9]
list = [1, 2, 3, 4, 5]
resault = []
list.each do |i|
resault << i * 2 - 1
end
p resault
#=> [1,3,5,7,9]
也可以用map的方式來做
list = [1, 2, 3, 4, 5]
p list.map { |i| i * 2 - 1 } # [1, 3, 5, 7, 9]
想要印出 1 ~ 100 的總合怎麼做呢
#第一種方式是先把(1..100)轉成陣列然後跑迴圈
total = 0
(1..100).to_a.each do |i|
total = total + i
end
puts total # 得到 5050
#[*1..100] 範圍1..100 跑迴圈
total = 0
[*1..100].each do |i|
total = total + i
end
puts total # 得到 5050
還有一個更簡單的方式 使用reduce
puts [*1..100].reduce(0) { |total, i| total + i }
#=> 要注意的是 使用reduce方式如果沒有帶參數給他的話 他會使用傳近來的第一個數字當成值
已上面例子來說 如果你沒帶0給他的話 那total 將會是1
我想隨機選五個數字該怎麼做?
puts [*1..52].shuffle.first(5)
#從1..52 當中 打亂洗牌(shuffle) 然後從最上面取 5 張出來
puts [*1..52].sample(5)
#從1..52中取五個