Ruby数组教程:掌握数据结构与常用操作

引言

数组是一种数据结构,它表示一个称为“元素”的值列表。数组允许您在一个变量中存储多个值。在 Ruby 中,数组可以包含任何数据类型,包括数字、字符串和其他 Ruby 对象。这可以压缩和组织您的代码,使其更易读和可维护。所有数组都是具有自身方法的对象,您可以调用这些方法,提供一种标准化处理数据集的方式。

在本教程中,您将创建数组,访问它们包含的值,向数组中添加、修改和移除元素,并通过遍历数组中的元素来解决更复杂的问题。

创建数组

您将首先详细了解如何创建数组。以鲨鱼物种为例,以下是一个各种鲨鱼物种的列表。如果没有数组,您可能会将它们分别存储在不同的变量中。

shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

这种方法冗长且很快就变得难以维护,因为它不够灵活。加入另一条鲨鱼意味着您需要添加和跟踪一个额外的变量。

如果您使用一个数组,您可以简化这个数据。在 Ruby 程序中创建一个数组,使用方括号([]),并用逗号分隔您想要存储的值。

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

不再创建三个单独的变量,而是现在有一个包含所有三只鲨鱼的变量。在这个例子中,您使用方括号([])创建了一个数组,并用逗号分隔每个条目。如果您需要添加另一只鲨鱼,您只需将其添加到数组中,而不是创建和管理一个新变量。

您可以使用打印语句来打印整个数组,它会显示数组的内容。

print sharks
输出
["Hammerhead", "Great White", "Tiger"]

如果您想创建一个每个元素都是单词的数组,您可以使用 %w{} 语法,它可以创建一个单词数组。

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

这等同于使用方括号创建数组。

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

然而,请注意,%w{} 方法允许您省去引号和逗号。

数组经常被用来组合相似数据类型的列表,但在 Ruby 中,数组可以包含任何值或混合值,甚至包括其他数组。下面是一个包含字符串、空值、整数和字符串数组的示例数组。

record = [
    "Sammy",
    nil,
    7,
    [
        "another",
        "array",
    ]
]

现在您将学习如何访问存储在数组中的数据。

访问数组中的项目

要访问数组的特定元素或项,您需要引用其索引或在数组中的位置。在 Ruby 中,索引从零开始。为了从您的鲨鱼数组中检索第一个元素,您需要使用方括号将元素的索引附加到变量上。

这是文章《如何在Ruby中使用数组》的第2部分(共6部分)。

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

sharks 数组包含三个元素。以下是该数组中每个元素的索引解析:

Hammerhead Great White Tiger
0 1 2

数组的第一个元素是“Hammerhead”(锤头鲨),其索引为0。最后一个元素是“Tiger”(虎鲨),其索引为2。在索引中,计数从0开始,这与我们从1开始计数的自然直觉不同。因此,在您习惯这种方式之前,请务必牢记这一点。

注意:您可以将索引视为偏移量,即表示距离数组起始位置的位数。第一个元素位于起始位置,因此其偏移量或索引为0。第二个元素距离数组的第一个位置有一个位置的距离,所以其偏移量或索引为1。

您可以使用 length 方法来确定数组中有多少个元素。

sharks.length
输出
3

尽管 sharks 数组的索引从0开始,一直到2,但 length 属性返回的是数组中元素的总个数,即3个。它不关心索引。

如果您想找出数组中特定元素(如“Tiger”)的索引号,可以使用 index() 方法。

print sharks.index("Tiger")
输出
2

这会返回第一个包含指定文本的元素的索引。如果找不到索引号,例如对于不存在的值,控制台将返回 nil

print sharks.index("Whale")
输出
nil

要获取数组中的最后一个元素,在 Ruby 中可以使用索引 -1

print sharks[-1]
输出
"Tiger"

Ruby 还提供了 firstlast 方法,用于获取第一个和最后一个元素,而无需使用索引。

puts sharks.first
puts sharks.last
输出
"Hammerhead"
"Tiger"

尝试访问不存在的索引将返回 nil

sharks[10]
输出
nil

这是文章《如何在Ruby中使用数组》的第3部分(共6部分)。

数组可以包含其他数组,这些被称为嵌套数组。这是在程序中建模二维数据集的一种方式。以下是一个嵌套数组的示例:

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

为了访问嵌套数组中的元素,您需要添加另一个索引号以对应内部数组。例如,要从这个嵌套数组中检索出“coral”的值,您可以使用以下语句:

print nested_array[1][0];
输出

coral

在这个例子中,您访问了nested_array变量中索引为1的数组,它返回了数组["coral", "reef"]。然后,您访问了该数组中索引为0的元素,它是“coral”。

现在您将学习如何向数组添加元素。

给数组添加元素

您的“鲨鱼”数组中有三个元素,它们的索引从0到2。

鲨鱼.rb

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

有几种方法可以添加一个新元素。您可以给下一个索引分配一个值,此处为3。

sharks[3] = "Whale";

print sharks
输出

[“Hammerhead”, “Great White”, “Tiger”, “Whale”]

虽然这种方法容易出错。如果您添加一个元素时不小心跳过了一个索引,那么数组中就会创建一个空元素。

sharks[5] = "Sand";

print sharks;
输出

[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Sand”]

尝试访问额外的数组元素将返回其值,该值将为nil

sharks[4]
输出

nil

在数组中找到下一个可用的索引是容易出错且耗时的。可以通过使用push方法来避免错误,该方法将一个元素添加到数组的末尾。

sharks.push("Thresher")
print sharks
输出

[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Sand”, “Thresher”]

您还可以使用 << 语法将元素添加到数组的末尾,而不是使用 push 方法。

sharks << "Bullhead"

这是文章《如何在Ruby中使用数组》的第4部分(共6部分)。

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

要在数组的开头添加一个元素,请使用unshift()方法。

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

现在你已经知道如何添加元素了,接下来你将学习如何移除它们。

从数组中移除元素

从数组中删除特定元素,可以使用deletedelete_at方法。在我们之前创建的鲨鱼数组中,你创建了一个空的数组元素(nil)。现在,你将把它移除。

首先,找到它在数组中的位置。你可以使用index方法来完成这个任务。

print sharks.index(nil)
输出
4

然后使用delete_at来删除索引为4的元素并打印数组。

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

使用delete方法从数组中删除与传入值匹配的元素。将其用于从数组中删除“Whale”。

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

delete方法将删除你传递的所有值的所有出现,因此如果数组中有重复的元素,它们都将被删除。

pop方法将删除数组中的最后一个元素。

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

“Bullhead”(牛头鲨)已被移除,因为它曾是数组的最后一个元素。为了移除数组的第一个元素,请使用shift方法。

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

这一次,数组开头位置的“Angel”被移除了。

通过使用popshift,你可以从数组的开头和末尾删除元素。在可能的情况下,最好使用pop,因为数组中的其他项会保留其原始索引编号。

删除元素时,delete_atpopshift方法都会改变原始数组,并返回你删除的元素。

鲨鱼.rb

这是文章《如何在Ruby中使用数组》的第5部分(共6部分)。

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}"
输出
Deleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]

现在你已经知道了几种从数组中删除元素的方法。接下来,你将学习如何修改数组中已有的元素。

修改数组中现有的元素

要更新数组中的元素,只需使用赋值运算符将新值赋给元素的索引,就像你对普通变量一样。

给定一个新的鲨鱼数组,其中索引为0的位置是“锤头鲨”,你将把它替换为“天使鲨”。

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

为了确保你更新的是正确的元素,你可以先使用索引方法来定位元素,就像你在查找想要删除的元素时所做的一样。

现在你将会学习如何处理数组中的所有元素。

遍历数组

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 的工作方式类似,但语法不同。

每个.rb

这是文章《如何在Ruby中使用数组》的第6部分(共6部分)。

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

each 方法使用了在 Ruby 编程中经常看到的一种语法。它接受一个 Ruby 块作为参数。块是一些代码,将在方法的上下文中稍后执行。在这种情况下,代码是 puts sharkshark 关键字,使用竖线字符(|)括起来,是代表块将访问的数组中的元素的局部变量。Ruby 将元素分配给这个变量,并在块中执行代码。each 方法重复这个过程,对数组中的每个元素都执行一次。

输出
Hammerhead
Great White
Tiger
Whale

当代码块只有一行时,你经常会看到 Ruby 开发者用花括号替换 doend 关键字,并将整个语句压缩为一行。

每个 .rb 文件
...
sharks.each { |shark| puts shark }

这样可以得到相同的结果,但是使用的代码行数更少。

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

每个 _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 变量。然后,您可以在块中引用这两个变量。

输出
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 中的其他数据类型。

bannerAds