如何遍历嵌套数组

时间:2015-02-17 21:52:21

标签: ruby arrays

我有目录的数据:

array = [
  ['Chapter 1', 'Numbers', 1],
  ['Chapter 2', 'Letters', 72],
  ['Chapter 3', 'Variables', 118]
]

我试图将数组的内容显示为这样的表:

Chapter 1     Numbers       1
Chapter 2     Letters      72
Chapter 3     Variables   118

这是我的代码:

lineWidth = 80
col1Width = lineWidth/4
col2Width = lineWidth/2
col3Width = lineWidth/4

array.each do |i|
  puts i[0].to_s.ljust(col1Width) + puts i[1].to_s.ljust(col2Width) + puts i[2].to_s.ljust(col3Width)
end

问题是我一直收到这个错误:

chapter7-arrays.rb:48: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
    puts i[0] + puts i[1] + puts i[2]
                      ^
chapter7-arrays.rb:48: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
    puts i[0] + puts i[1] + puts i[2]

所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您的代码几乎是正确的。问题是您正在连接多个puts调用,而您应该连接String个参数,并使用单个puts调用。

array = [['Chapter 1', 'Numbers', 1],['Chapter 2', 'Letters', 72],['Chapter 3', 'Variables', 118]]

lineWidth = 80
col1Width = lineWidth/4
col2Width = lineWidth/2
col3Width = lineWidth/4

array.each do |i|
    puts i[0].to_s.ljust(col1Width) +
         i[1].to_s.ljust(col2Width) +
         i[2].to_s.ljust(col3Width)
end

答案 1 :(得分:1)

我已根据 dgilperez

的要求添加了解释

我们有一个子阵列数组,每个子阵列有三个元素。 我们为子数组中的每个项目提供了三种不同的格式值。 将格式值存储在数组中也很方便。

lines = [lineWidth/4, lineWidth/2, lineWidth/4]

现在我们需要管理每个子数组的循环

array.each do |i| 
  i.map
end

...我们需要当前元素的索引来获取相应的格式化值。

array.each do |i| 
  i.map.with_index
end

现在我们实现一个为子项 z 的每个项执行的块

i.map.with_index{|z, index| z.to_s.ljust(lines[index])}

... 索引的范围为[0,1,2]。 因此,对于第一项,我们将使用第一个格式值等

index == 0,lines [index] == lineWidth / 4

index == 1,lines [index] == lineWidth / 2

这个块返回一个字符串数组,因为我们通过函数 map 组织了一个循环。检查地图方法文档here

现在我们需要使用方法 join

将所有字符串连接成一个字符串
i.map.with_index{|z, index| z.to_s.ljust(lines[index])}.join 

返回最后一个字符串 - 在块

之前添加方法 puts
puts i.map.with_index{|z, index| z.to_s.ljust(lines[index])}.join

这是最终代码

array = [['Chapter 1', 'Numbers', 1],['Chapter 2', 'Letters', 72],['Chapter 3', 'Variables', 118]]

lineWidth = 80
lines = [lineWidth/4, lineWidth/2, lineWidth/4]

array.each do |i| 
  puts i.map.with_index{|z, index| z.to_s.ljust(lines[index])}.join
end