如何在Ruby中操作陣列

介紹

一個陣列是一種表示數值列表的資料結構,被稱為元素。陣列讓你可以將多個數值存儲在一個變量中。在 Ruby 中,陣列可以包含任何數據類型,包括數字、字符串和其他 Ruby 對象。這可以壓縮和組織你的代碼,使其更易讀和維護。所有的陣列都是具有自己方法的對象,你可以調用這些方法,提供了一種標準化的方法來處理數據集。

在這個教程中,你將創建陣列,訪問它們包含的值,在陣列中添加、修改和刪除元素,並遍歷陣列中的元素以解決更複雜的問題。

創建一個陣列

首先,讓我們詳細介紹如何創建陣列。舉個例子,這裡是各種鯊魚品種的列表。如果沒有陣列,你可能會將它們存儲在各個單獨的變量中:

sharks.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

這種方法冗長,很快就會變得難以維護,因為它不夠靈活。添加另一個鯊魚意味著你需要添加並跟蹤一個額外的變量。

如果使用陣列,你可以簡化這個數據。要在 Ruby 程序中創建陣列,使用方括號([]),並用逗號分隔你想要存儲的值:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

而不是創建三個單獨的變量,現在您有一個包含所有三條鯊魚的變量。在這個例子中,您使用方括號[]創建了一個數組,並用逗號分隔每個項目。如果您需要添加另一條鯊魚,您將向數組添加另一條鯊魚,而不是創建和管理新的變量。

您可以使用print語句打印整個數組,這將顯示數組的內容:

print sharks
Output
["Hammerhead", "Great White", "Tiger"]

如果您想創建一個數組,其中每個項目都是單詞,您可以使用%w{}語法,這創建了一個詞數組

days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}

這相當於使用方括號創建數組:

days =  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

但請注意,%w{}方法允許您跳過引號和逗號。

數組通常用於將類似數據類型的列表分組在一起,但在Ruby中,數組可以包含任何值或各種值的混合。這包括其他數組。這是一個包含字符串、nil值、整數和字符串數組的示例:

mixed_data.rb
record = [
    "Sammy",
    null,
    7,
    [
        "another",
        "array",
    ]
]

現在您將看看如何訪問存儲在數組中的數據。

訪問數組中的項目

為了訪問特定項目或陣列的元素,您引用其索引或在陣列中的位置。在Ruby中,索引從零開始。為了檢索您的sharks陣列中的第一個元素,您需要將元素的索引附加到變數中,並使用方括號:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

sharks陣列有三個元素。以下是sharks陣列中每個元素的索引方式:

Hammerhead Great White Tiger
0 1 2

陣列中的第一個元素是Hammerhead,其索引為0。最後一個元素是Tiger,其索引為2。索引從0開始計數,這與從1開始計數的自然直覺相反,請記住直到變得自然為止。

注意:將索引視為偏移量可能有助於您,這意味著它距離陣列的開頭有多遠。第一個元素在開始位置,因此其偏移量或索引為0。第二個元素距離陣列的第一個項目只有一個位置,因此其偏移量或索引為1

您可以使用length方法查看陣列中有多少元素:

sharks.length
Output
3

儘管sharks的索引從02,但length屬性返回陣列中的元素數量,即3。它根本不關心索引。

如果您想查找陣列中特定元素的索引號,例如Tiger,請使用index()方法:

print sharks.index("Tiger")
Output
2

這將返回包含該文字的第一個元素的索引。如果找不到索引號,例如對於不存在的值,控制台將返回`nil`:

print sharks.index("Whale")
Output
nil

要在Ruby中獲取數組的最後一個元素,請使用索引`-1`:

print sharks[-1]
Output
"Tiger"

Ruby還提供了`first`和`last`方法來獲取第一個和最後一個元素,而不使用索引:

puts sharks.first
puts sharks.last
Output
"Hammerhead" "Tiger"

嘗試訪問不存在的索引將返回`nil`:

sharks[10]
Output
nil

數組可以包含其他數組,這些被稱為`嵌套數組`。這是在程序中建模二維數據集的一種方法。這是一個嵌套數組的示例:

nested_array = [
    [
        "salmon",
        "halibut",
    ],
    [
        "coral",
        "reef",
    ]
]

為了訪問嵌套數組中的元素,您需要添加另一個索引號以對應內部數組。例如,要從這個嵌套數組中檢索值`coral`,您將使用以下語句:

print nested_array[1][0];
Output
coral

在此示例中,您訪問了`nested_array`變量的位置為`1`的數組,它返回了數組`[“coral”, “reef”]`。然後,您訪問了該數組的位置`0`的元素,即`”coral”`。

現在您將看看如何將元素添加到數組中。

將元素添加到數組中

您的`sharks`數組中有三個元素,它們的索引範圍是從`0`到`2`:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

有幾種方法可以添加新元素。您可以將值分配給下一個索引,而在這種情況下,它將是3

sharks[3] = "Whale";

print sharks
Output
["Hammerhead", "Great White", "Tiger", "Whale"]

這種方法存在錯誤風險。如果您添加一個元素並意外跳過一個索引,它將在數組中創建一個nil元素。

sharks[5] = "Sand";

print sharks;
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Sand"]

嘗試訪問額外的數組元素將返回其值,該值將為nil

sharks[4]
Output
nil

查找數組中的下一個可用索引存在錯誤風險並且需要額外的時間。通過使用push方法添加元素來避免錯誤,該方法將元素添加到數組的末尾:

sharks.push("Thresher")
print sharks
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher"]

您也可以使用<<語法而不是push方法將元素添加到數組的末尾:

sharks << "Bullhead"
Output
["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

要將元素添加到數組的開頭,請使用unshift()方法:

sharks.unshift("Angel")
print sharks
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

現在您知道如何添加元素了,接下來您將了解如何刪除它們。

從數組中刪除元素

要從數組中刪除特定元素,請使用deletedelete_at方法。在sharks數組中,您之前創建了一個nil數組元素。現在,您將其刪除。

首先,找到它在數組中的位置。您可以使用index方法來做到這一點:

print sharks.index(nil)
Output
4

然後使用delete_at來刪除索引4處的元素並打印數組:

sharks.delete_at(4)
print sharks
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]

delete方法會從陣列中刪除與您傳遞的值匹配的元素。使用它來從陣列中刪除Whale

sharks.delete("Whale")
print sharks;
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]

delete方法將刪除您傳遞的值的所有出現次數,因此如果您的陣列包含重複的元素,它們都將被刪除。

pop方法將從陣列中刪除最後一個元素:

sharks.pop
print sharks;
Output
["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]

作為陣列的最後一個元素,Bullhead已被刪除。為了刪除陣列的第一個元素,使用shift方法:

sharks.shift
print sharks
Output
["Hammerhead", "Great White", "Tiger", "Thresher"]

這次,Angel從陣列的開頭被移除。

通過使用popshift,您可以從陣列的開頭和結尾刪除元素。在可能的情況下,優先使用pop,因為陣列中其餘的項目保留其原始索引號。

delete_atpopshift方法都會更改原始陣列並返回您刪除的元素:

sharks.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop

puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"

puts "Remaining array: #{sharks}"
Output
Deleted_at element: Great White Popped element: Whale Remaining array: ["Hammerhead", "Tiger"]

現在您已經知道了從陣列中刪除元素的幾種方法。現在您將看看如何修改您已經擁有的元素。

修改現有陣列中的元素

要更新陣列中的元素,只需使用賦值運算符將新值分配給元素的索引,就像處理常規變量一樣。

給定一個新的鯊魚數組,其中"Hammerhead"位於索引0,你將用"Angel"替換"Hammerhead"

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
Output
["Angel", "Great White", "Tiger", "Whale"]

為確保更新正確的元素,你可以使用index方法首先定位元素,就像你找到要刪除的元素一樣。

現在你將看看如何處理數組中的所有元素。

遍歷數組

Ruby提供了許多遍歷數組的方法,每種方法的使用取決於你想要執行的工作的性質。接下來,你將探討如何遍歷數組並顯示每個元素。

Ruby提供了for..in語法:

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
  puts shark
end

對於sharks數組中的每個元素,Ruby將該元素分配給本地變量shark。然後,你可以使用puts打印元素的值。

雖然你不太常見for..in。Ruby數組是對象,它們提供了each方法來處理元素。each方法的工作方式類似於for..in,但具有不同的語法:

each.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
  puts shark
end

each方法使用了在Ruby编程中经常见到的语法。它将一个Ruby块作为其参数。 是一些稍后在方法上下文中执行的代码。在本例中,代码是puts sharkshark关键字,用管道字符(|)括起来,是代表块将访问的数组元素的局部变量。Ruby将元素分配给此变量,并执行块中的代码。each方法对数组中的每个元素重复此过程:

Output
Hammerhead Great White Tiger Whale

当块只是单行时,你经常会看到Ruby开发人员用花括号替换doend关键字,并将整个语句压缩成一行:

each.rb
...
sharks.each {|shark| puts shark }

这会产生相同的结果,但使用更少的代码行。

each_with_index方法以类似的方式工作,但它还允许您访问数组元素的索引。此程序使用each_with_index打印每个元素的索引和值:

each_with_index.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index|
  puts "The index is #{index}"
  puts "The value is #{shark}"
end

对于数组中的每个元素,Ruby将元素分配给变量shark,并将当前索引分配给index变量。然后您可以在块中引用这两个变量。

Output
The index is 0 The value is Hammerhead The index is 1 The value is Great White The index is 2 The value is Tiger The index is 3 The value is Whale

在自己的程序中,您经常会迭代数组中的元素,例如当您需要在网站上显示来自数据库的项目时,或者当您从文件中读取行并处理其内容时。

結論

數組是 Ruby 程式設計中極為靈活和基本的部分。在本教程中,您創建了數組並訪問了單個元素。您還添加、刪除和修改了數組中的元素。最後,您探索了兩種迭代數組並顯示其內容的方法,這是一種常用的顯示數據的方法。

通過閱讀教程 了解 Ruby 中的其他數據類型 來了解更多有關 Ruby 中其他數據類型的信息。

Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby