11 Ruby 的陣列
在之前的章節中,我們學習了布林物件、數字物件、字串物件等,但是有的時候,我們需要將一組物件組合起來成為一個獨立的物件,本章節讓我們將學習 Ruby 陣列,如何建立一個數組以及掌握其常用的例項方法。
1. 陣列是什麼?
Ruby 陣列是任何物件的有序整數索引集合。陣列中的每個元素都與一個索引相關,並可通過索引進行獲取。—— 官方定義
Ruby 陣列是一個包含許多元素的物件。這些元素可以是變數(例如 String,Integer,Hash 等),甚至可以是其他物件(包括構成多維陣列的其他陣列)。定義中索引指的是陣列元素中的一個序號,它從0開始,每個索引對應一個元素。將所有元素放到陣列之後,您可以通過各種方法來對陣列之中的元素進行操作。
那麼如何建立一個數組呢?
2. 如何建立一個數組
Ruby 提供了許多建立陣列的方式,陣列本質上是 Array 類,所以我們可以使用 Array 的new
方法來建立陣列。
例項:
> Array.new
=> []
[]
表示一個空陣列。我們還可以通過向new
方法傳遞引數預設陣列的元素數量。
例項:
# 預設裡面有3個元素
> Array.new(3)
=> [nil, nil, nil]
解釋:通過預設大小之後的陣列的元素為預設數量,所有元素會使用nil
代替。
除此之外,我們還可以在建立的時候預設資料。
例項:
> Array[ "Mon", "Tues" , "Wed", "Thu", "Fri", "Sat", "Sun" ]
=> ["Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun"]
通常我們省略 Array,只使用方括號來預設資料。
注意事項:Array.new()
引數是數字,用於預設陣列的數量,而陣列的每一個值都為nil
,而Array[]
中,引數是一組由逗號分隔的資料,引數裡面資料的數量即為陣列資料的數量,值及為預設的值。
例項:
> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
=> ["Mon", "Tues" , "Wed", "Thu", "Fri", "Sat", "Sun"]
經驗:我們有幾種快速建立陣列的方式:
建立字串陣列:
> %w{ cat dog monkey }
=> ["cat", "dog", "monkey"]
建立 Symbol 陣列:
> %i{ cat dog monkey }
=> [:cat, :dog, :monkey]
3. 陣列的常用例項方法
3.1 判斷陣列是否為空
使用empty?
方法來判斷陣列是否為空:
例項:
# 定義一個空陣列
> days_of_week = []
=> []
days_of_week.empty?
=> true
或者使用size
或者length
方法,判斷陣列的長度為0。
例項:
> days_of_week.length == 0
=> true
> days_of_week.size == 0
=> true
3.2 訪問陣列元素
陣列的元素可以通過結合[]
方法引用相關元素的索引來訪問。例如,要訪問陣列的第一個和第二個元素。
例項:
# 定義一個數組
> days_of_week = [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
=> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
> days_of_week[0]
=> "Mon"
> days_of_week[1]
=> "Tues"
或者使用at
方法:
例項:
> days_of_week.at(0)
=> "Mon"
可以使用 Array 類的first
和last
方法訪問首個和末尾元素。
例項:
> days_of_week.first
=> "Mon"
> days_of_week.last
=> "Sun"
3.3 查詢某一個元素的索引
通常在使用陣列時,有必要找出特定元素的索引。這可以通過使用 index
方法來實現,該方法返回第一個元素的索引以匹配指定的條件。例如,確定星期幾陣列中“星期三”元素的索引值。
例項:
# 定義一個數組
> days_of_week = [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
=> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
> days_of_week.index("Wed")
=> 2
rindex
方法可用於查詢陣列中的最後一個匹配元素。
例項:
# 定義一個數組
> days_of_week = ["today", "today", "today", "today", "today", "today", "today"]
=> ["today", "today", "today", "today", "today", "today", "today"]
# 返回首個匹配的索引
> days_of_week.index("today")
=> 0
# 返回最後匹配的索引
> days_of_week.rindex("today")
=> 6
3.4 提取陣列元素的子集
可以通過指定起點和要提取的元素數來提取陣列元素的子集。
例如,從元素1開始並讀取3個元素:
例項:
# 定義一個數組
> days_of_week = [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
=> [ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
> days_of_week[1, 3]
=> ["Tues", "Wed", "Thu"]
同樣,我們可以指定一個範圍(請參考 Ruby的範圍章節)。
例項:
> days_of_week[1..3]
=> ["Tues", "Wed", "Thu"]
或者,可以使用 Array 類的slice
方法。
例項:
> days_of_week.slice(1..3)
=> ["Tues", "Wed", "Thu"]
3.5 合併陣列
Ruby 中的陣列可以使用多種不同的方法進行連線。
通過+
合併。
例項:
days1 = ["Mon", "Tue", "Wed"]
days2 = ["Thu", "Fri", "Sat", "Sun"]
days = days1 + days2
=> ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
使用concat
方法
例項:
days1 = ["Mon", "Tue", "Wed"]
days2 = ["Thu", "Fri", "Sat", "Sun"]
days = days1.concat(days2)
=> ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
使用<<
方法將元素附加到現有陣列。
例項:
days1 = ["Mon", "Tue", "Wed"]
days1 << "Thu" << "Fri" << "Sat" << "Sun"
=> ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
3.6 交集、並集、差集
方法 | |
---|---|
- | 差集:返回一個新陣列,該陣列是第一個陣列的副本,同時也刪除了第二個陣列中出現的所有專案。 |
& | 交集:從兩個現有陣列建立一個新陣列,該陣列僅包含兩個陣列共有的元素,重複項會被刪除。 |
| | 並集:連線兩個陣列,重複項會被刪除。 |
例項:
讓我們先定義兩個陣列:
operating_systems = ["Fedora", "SuSE", "RHEL", "Windows", "MacOS"]
linux_systems = ["RHEL", "SuSE", "PCLinuxOS", "Ubuntu", "Fedora"]
建立一個並集,並集操作將一個數組連線到另一個數組,但是刪除了所有重複的陣列元素。
operating_systems | linux_systems
=> ["Fedora", "SuSE", "RHEL", "Windows", "MacOS", "PCLinuxOS", "Ubuntu"]
接下來建立一個交集,獲得兩個陣列共有的元素。
operating_systems & linux_systems
=> ["Fedora", "SuSE", "RHEL"]
最後我們建立差集,我們不只是使用此運算子刪除重複的條目,還需要從左側運算元指定的陣列中刪除在右側運算元指定的陣列中也存在的項。
operating_systems - linux_systems
=> ["Windows", "MacOS"]
linux_systems - operating_systems
=> ["PCLinuxOS", "Ubuntu"]
3.7 去除陣列元素中重複項
使用uniq
方法刪除重複項。
linux_systems = ["RHEL", "SuSE", "PCLinuxOS", "Ubuntu", "Fedora", "RHEL", "SuSE"]
linux_systems.uniq
=> ["RHEL", "SuSE", "PCLinuxOS", "Ubuntu", "Fedora"]
注意事項:在這種情況下,uniq
方法不會更改原始陣列。如果您真的想從陣列中刪除重複項,以便更改陣列本身,請使用uniq!
例項:
linux_systems
=> ["RHEL", "SuSE", "PCLinuxOS", "Ubuntu", "Fedora", "RHEL", "SuSE"]
linux_systems.uniq!
=> ["RHEL", "SuSE", "PCLinuxOS", "Ubuntu", "Fedora"]
linux_systems
=> ["RHEL", "SuSE", "PCLinuxOS", "Ubuntu", "Fedora"]
3.8 向陣列中增加或減少元素(push和pop)
Ruby 中的陣列可以視為“後進先出”堆疊。當我們想要將新元素放到陣列中,它會被插入到最後一個。
我們使用push
方法。
例項:
colors = ["red", "green", "blue"]
=> ["red", "green", "blue"]
colors.push "indigo"
=> ["red", "green", "blue", "indigo"]
colors.push "violet"
=> ["red", "green", "blue", "indigo", "violet"]
我們使用pop
方法從陣列移出元素,陣列會從最後一個元素開始移出。pop
的返回值是被移出的元素。
例項:
colors.pop
=> "violet"
colors.pop
=> "indigo"
3.9 陣列的比較
可以使用==
,<=>
和eql?
比較 Ruby 陣列。
如果兩個陣列包含相同數量的元素並且每個陣列的內容相同,則==
返回true
。
在==
為true
的基礎上,每個元素的元素型別也相同,則eql?
返回true
。
最後,<=>
方法(也稱為“飛船”方法)比較兩個陣列,如果兩個陣列相等(此處比較方式同==
),則返回0;如果元素小於另一個數組中的元素,則返回-1;如果它們大於另一個,則返回1。
例項:
a = [1, 'a', 1.0]
b = [1.0, 'a', 1.0]
a == b # true
a.eql?b # false
a <=> b # 0
3.10 修改陣列元素
使用insert
方法在陣列指定索引位置插入元素。
例項:
colors = ["red", "green", "blue"]
=> ["red", "green", "blue"]
colors.insert( 1, "orange" )
=> ["red", "orange", "green", "blue"]
使用[]=
方法,修改陣列指定索引位置的值。
例項:
colors = ["red", "green", "blue"]
=> ["red", "green", "blue"]
colors[1] = "yellow"
=> "yellow"
colors
=> ["red", "yellow", "blue"]
在[]=
方法中使用範圍,可以一次修改多個元素。
例項:
colors = ["red", "green", "blue"]
=> ["red", "green", "blue"]
colors[1..2] = "orange", "pink"
=> ["orange", "pink"]
colors
=> ["red", "orange", "pink"]
3.11 刪除陣列元素
基於索引來刪除元素,我們使用delete_at
方法。
例項:
colors = ["red", "green", "blue"]
=> ["red", "green", "blue"]
colors.delete_at(1)
=> "green"
colors
=> ["red", "blue"]
基於元素內容來刪除的話,使用delete
方法。
例項:
colors = ["red", "green", "blue"]
=> ["red", "green", "blue"]
colors.delete("red")
=> "red"
colors
=> ["green", "blue"]
3.12 陣列的排序
numbers = [1, 4, 6, 7, 3, 2, 5]
=> [1, 4, 6, 7, 3, 2, 5]
numbers.sort
=> [1, 2, 3, 4, 5, 6, 7]
reverse
方法可以將陣列倒序排列。
numbers = [1, 4, 6, 7, 3, 2, 5]
=> [1, 4, 6, 7, 3, 2, 5]
numbers.reverse
=> [5, 2, 3, 7, 6, 4, 1]
Tips : 和
uniq!
方法一樣,使用sort!
和reverse!
方法會對呼叫方法的陣列直接進行修改。
4. 小結
在本章中,我們學習瞭如何在 Ruby 中建立陣列,如何對陣列進行為空判斷、如何訪問陣列元素、查詢索引、提取元素子集、合併陣列、去重、排序、刪除某一元素以及進行交集、並集、差集操作。