【问题标题】:is it possible to reference an index position in a nested array? Ruby是否可以引用嵌套数组中的索引位置?红宝石
【发布时间】:2020-10-03 21:45:21
【问题描述】:

我是 Ruby;我看到关于这个主题有各种各样的问题..但是找不到这样的问题,但我收集多维数组在 ruby​​ 中不存在。所以我正在为一个虚构的数据集使用嵌套数组。是否可以引用嵌套数组中子元素的索引位置?我认为迭代并为每个数组创建一个块是最好的前进方式(并在 SO 上确认了这一点)。我在另一篇文章中看到建议使用 Narray 库...这适用于字符串吗?我的第一个目标是打印出每个名字和最后一个感兴趣的区域。我举了一个例子来说明我在这个例子中大致试图实现的目标.. 非常感谢

 staff_array = [
    ["paulBarry",
    ["programming", "networking", "security", "open source" ,"frameworks"]],
    ["chrisMuedec", 
    ["testing", "safety systems", "formal systems", "programming languages"]],
    ["nigelwhite",
     ["graphics", "imaging", "programming","sign languages","trees"]],
     ["austinKinsella", 
     ["networks", "wans", "programming", "macintosh", "digital photography"]],
     ["gerryMoloney", 
     ["placement", "employment", "emerging systems", "webdevelopment"]
     ]
    ]

    staff.each do |name_array|
      # Iterate through the parent array, returning each element sequentially

  name_array.each do |interest_element|
    # Iterate through each element of the child  array returned by the above parent iteration

示例:

  puts {#name_array}+ name_array.each do |interest_element|[-1]

  end
end

预期的输出是:

Paulbarry: Frameworks
ChrisMuedec: Programming languages
Nigelwhite: Trees
AustinKinsella: Digital photography
GerryMoloney: Webdevelopment.

【问题讨论】:

  • 您的预期输出是什么?您是否检查过 Hash 对于员工当前持有的数据类型是否是更好的数据结构?
  • 您能否发布有效的 ruby​​ 代码(运行时不会引发错误的代码)以及预期结果?
  • 嗨塞巴斯蒂安,我对此相当陌生,因为我了解散列是针对键值对,即 1 个值到 1 个键...所以我每个键都有多个值,所以我忽略了它。嗨 Viktor,我会尽快更新,谢谢
  • puts {#name_array} + name_array.each do |interest_element|[-1]; end 不符合您的预期。首先,#name_array 会引发异常。如果你写,puts name_array + name_array.each do |interest_element|[-1]; end,Ruby 首先执行,name_array.each do |interest_element|[-1]; end。你会看到Array#each方法返回了它的接收者name_array,所以表达式变成了puts name_array + name_array
  • 欢迎来到 SO!请参阅“How to Ask”、“Stack Overflow question checklist”及其所有链接页面。语法在 SO 上很重要,所以请尽量写得好。我建议使用拼写和语法检查器。 SO 不是留言板或论坛,它更像是一本语法很重要的在线参考书。

标签: arrays ruby multidimensional-array indexing data-structures


【解决方案1】:

Ruby 有嵌套数组。无论嵌套级别如何,您都使用从 0 开始的 [] method 引用索引位置。

array = [
  [
    ['0.0.0', '0.0.1', '0.0.2'],
    ['0.1.0', '0.1.1', '0.1.2'],
    ['0.2.0', '0.2.1', '0.2.2'],
  ],
  [
    ['1.0.0', '1.0.1', '1.0.2'],
    ['1.1.0', '1.1.1', '1.1.2'],
    ['1.2.0', '1.2.1', '1.2.2'],
  ],
  [
    ['2.0.0', '2.0.1', '2.0.2'],
    ['2.1.0', '2.1.1', '2.1.2'],
    ['2.2.0', '2.2.1', '2.2.2'],
  ],
]

array[0][0][0] # => '0.0.0'
array[0][1][2] # => '0.1.2'
array[2][2][2] # => '2.2.2'

还有一些具体的方法,比如firstlast

array.first.first.first # => '0.0.0'
array.last.last.last    # => '2.2.2'

【讨论】:

  • array.dig(0, 1, 2)
  • 小心dig,@steenslag。 array[1][99][0] #=> NoMethodError (undefined method '[]' for nil:NilClass),这可能是我们想要的,而 array.dig(1, 99, 0) 很高兴返回 nil,可能会掩盖错误一段时间。
  • 听起来不错,谢谢!刚刚在文档上大吃一惊,因为我正在寻找访问每个数组的最后一个元素的简单方法。我可能会尝试 dig 方法..因为它听起来很简单..可能!谢谢小伙子
  • 嗨,Cary,抱歉刚刚看到你的评论,我不完全理解
  • 把@CarySwoveland 的评论用人的话说:如果你的主管告诉你“去帕克兰大道 7628 号,问男主人他大孩子的名字”,但事实证明, Parkland Drive 最多只有 127 个门牌号,第一个门牌号相当于向您的主管返回错误“没有这样的地址”;第二个是告诉他“这个人没有孩子”。当结果可能有多种解释时,默认值是危险的。 (没有这样的地址,或者没有“家中的男人”——单身女性、女同性恋夫妇……——或者合法地没有孩子)。
【解决方案2】:

我的第一个目标是打印出每个名字和最后一个感兴趣的区域。

staff_array.each do |name, interests|
  puts "#{name.sub(/./) { |m| m.upcase }}: #{interests.last.capitalize}"
end

输出:

PaulBarry: Frameworks
ChrisMuedec: Programming languages
Nigelwhite: Trees
AustinKinsella: Digital photography
GerryMoloney: Webdevelopment

也许从这第一步你可以推断出如何概括来回答你的其他问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2011-04-18
    相关资源
    最近更新 更多