Bear Su's Blog

Ruby Array 的一些筆記

圖片來源 フリー写真素材ぱくたそ

紀錄一下我覺得值得一提的那些陣列兩三事

給予陣列預設值


> Array.new(3, "str")
=> ["str", "str", "str"]

> Array.new([1, 2, 3])
=> [1, 2, 3]

> Array.new(3) {|i| i * 3}
=> [0, 3, 6]

# 要注意的是用預設值,所有元素都會指向同一個參考位址
> arr = Array.new(3, "a")
=> ["a", "a", "a"]

> arr[0].next!
=> "b"

# 全部的預設值元素都變成 "b" 了
> arr
=> ["b", "b", "b"]

新增元素


> arr = []
=> []

# 在結尾插入
> arr.push("Bear")
=> ["Bear"]

# 在結尾插入
> arr << "Candy"
=> ["Bear", "Candy"]

# 在開頭插入
> arr.unshift("Andy")
=> ["Andy", "Bear", "Candy"]

# 合併陣列
> arr.concat ["Other", "Another"]
=> ["Andy", "Alex", "Bear", "Dennis", "Emily", "Other", "Another"]

# 以上方法都會改變原本陣列的值

# 合併陣列
> arr = arr + ["Dennis", "Emily"]
=> ["Andy", "Alex", "Bear", "Dennis", "Emily"]

填滿某個值


arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

# 全部歸零
arr.fill(0)
=> [0, 0, 0, 0, 0]

# 談入對應的索引
arr.fill { |index| index }
=> [0, 1, 2, 3, 4]

一次取得多個不同索引的元素


> [1, 2, 3, 4, 5].values_at(1, 2, 3)
=> [2, 3, 4]

清除陣列中全部的 nil


> arr = [1, nil, 2, nil, 3]
=> [1, nil, 2, nil, 3]

# 只是回傳清除 nil 後的結果,但不會改變陣列的值
> arr.compact
=> [1, 2, 3]
> arr
=> [1, nil, 2, nil, 3]

# 要用 compact! 才會改變陣列的值
> arr.compact!
=> [1, 2, 3]
> arr
=> [1, 2, 3]

一邊取出陣列的值一邊運算的寫法


arr.pop 也能改成 app.shift

> arr = [1, 2, 3]
> while item = arr.pop
>   puts item
> end
3
2
1
=> nil

> arr
=> []

根據型態,呼叫 * 方法會有不同的結果


> [ 1, 2, 3 ] * 3
=> [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ]

# * 字串會跟 join 方法一樣結果
> [ 1, 2, 3 ] * ","
=> "1,2,3"

轉置矩陣


# 矩陣
# | 1, 2, 3|
# | 4, 5, 6|
arr = [[1, 2, 3], [4, 5, 6]]
=> [[1, 2, 3], [4, 5, 6]]

# 旋轉後
# | 1, 4|
# | 2, 5|
# | 3, 6|
> arr.transpose
=> [[1, 4], [2, 5], [3, 6]

# 不會改變陣列的值
> arr
=> [[1, 2, 3], [4, 5, 6]]

求陣列長度


# 一般
> [1, nil, nil, 3, nil, 4].length
=> 6

# 取得非 nil  的元素個數
> [1, nil, nil, 3, nil, 4].nitems
=> 3

參考:


Ruby Document: Array Class

另外關於操作集合的技巧可以參考:

集合的使用技巧(一) | Ruby

集合使用的技巧(二) | Ruby

集合使用的技巧(三) | Ruby


如果覺得這篇文章對您有所幫助,歡迎贊助我一杯咖啡 ☕️

祝您有美好的一天 ❤️