arrays - 如何根据 Ruby 数组的内容删除项目?

标签 arrays ruby

我正在 Ruby 中创建一种变量系统,用户可以在其中创建变量。如果它们给出变量名称和内容,它会将给定的名称和字符串添加到数组中,从而向数组中添加另外两个项目。代码如下:

$vars = []
  def create(name, value)
    $vars << name
    $vars << value
  end

我还想添加一个“删除”选项,用户在其中输入 delete("varName") 并在幕后搜索 $ 中具有相同值的项目vars 数组并删除它。有什么办法可以做到这一点吗?另外,有什么方法可以获取项目的数量(例如数组中的项目是 ["a", "b", "c", "d"] 并且用户想要删除"d",然后程序返回 3,因为那是 "d" 的位置。

最佳答案

一个Hash用于存储成对的项目。它速度更快,并且保证名称是唯一的。

$vars = {}
def create(name, value)
  $vars[name] = value
end

那么删除就很简单了。

$vars.delete(name)

就像寻找值(value)一样。

value = $vars[name]

哈希会记住添加键的顺序。 $vars.keys将按添加顺序返回名称数组。然后你可以使用find_index获取它在键列表中出现的位置。

index = $vars.keys.find_index(name)

除了让用户知道变量声明的顺序之外,这没有多大用处。变量没有顺序。


如果您想对数组执行此操作,首先我们要修复create。它将键和值存储在同一个数组中。

create(a, 23)
create(b, 42)

# $var = ['a', 23, 'b', 42]

相反,将每一对存储在其自己的数组中。

def create(name, value)
  $vars << [name, value]
end

create(a, 23)
create(b, 42)

# $var = [['a', 23], ['b', 42]]

然后要删除,请使用 index 仅搜索每对的第一个元素。然后删除该索引。

def delete(name)
  idx = $vars.map(&:first).index(name)
  $vars.delete_at(idx) if idx

  return idx
end

查找名称的值的工作方式类似。找到匹配名称的索引,查找该对,返回其第二个元素(值)。

def find(name)
  idx = $vars.map(&:first).index(name)
  pair = $vars[idx]
  return pair[1]
end

但不要这样做,使用哈希。

关于arrays - 如何根据 Ruby 数组的内容删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61602484/

相关文章:

JQuery 获取当前数组索引位置

javascript - 过滤包含特定值的多维数组

mysql - 使用 ActiveRecord 延迟删除 MySQL 中的临时表

ruby-on-rails - RVM MultiUser 安装不安全?

正则表达式错误 - (编码正则表达式匹配不兼容(带有 ASCII-8BIT 字符串的 UTF-8 正则表达式)

ruby-on-rails - 带有 Pry 的 Rails 控制台

c - 如何访问在 main 中的另一个函数中创建的数组而不返回它?

arrays - 是否可以在 Swift 中将子类型的元组添加到类型的元组数组中?

php - 如何将多个表的值添加到一个数组中?

Ruby Cyphering 导致非字母数字字符