【问题标题】:while vs each loopwhile 与每个循环
【发布时间】:2015-08-14 13:07:55
【问题描述】:

我正在转置一个包含 M 行和 N 列的二维数组,其中 M 是外部数组的长度,N 是嵌套数组的长度(我在解决方案中考虑了不同的长度):

a = [[1, 2], [3, 4, 5], [6], [7, 8, 9], [10, 11, 12]]

我使用each 的工作解决方案是:

(0..(@columns-1)).each do |col|
  (0..(@rows-1)).each do |row|
    print @ar[row][col]
  end
  print "\n"
end

结果是:

136710
24-811
-5-912

作为验证的结果,我用'-' 填充了空白点,以使内部数组的长度相同。

我尝试使用以下while 循环解决问题:

while @columns > 0
  while @rows > 0
    p @ar[(@rows - 1)][(@columns - 1)]
    @rows = @rows - 1
  end
  @columns = @columns - 1
end

结果是:

12
9
"-"
5
"-"

为什么each 循环有效而while 循环无效?

【问题讨论】:

  • while 版本中,您不会在每次外循环迭代时重置@rows。此外,您稍后可能会使用这些变量,但它们的值现在已损坏。
  • @TheF @rows@columns 似乎不是数组。
  • @SergioTulentsev 是真的。您的评论完全正确。
  • MN 在哪里使用? @columns@rows 是什么?
  • @SoSimple:如果它们被用在其他地方,你不应该在愚蠢的循环中改变它们的值:)

标签: arrays ruby loops


【解决方案1】:

主要问题是,在您第一次退出内部行循环后,@rows 被设置为 0。由于 @rows 永远不会重置为其原始值,因此在您移动后,@rows > 0 仍然为 false到下一列。试试这个:

original_rows = @rows
while @columns > 0
  while @rows > 0
    print @ar[(@rows - 1)][(@columns - 1)] # Also use `print` here, not `p`
    @rows = @rows - 1
  end
  print "\n" # You also forgot this
  @columns = @columns - 1
  @rows = original_rows # Move back to the first row
end

当然,在实际应用中,转置数组的最佳方式实际上就是:

@ar.transpose

但这对于学习练习不是很有帮助。

【讨论】:

  • 虽然您的回答在技术上是正确的,但我想不出一个不使用局部变量 rows 的理由,当您最终设置 @rows 值时。
  • 我假设 OP 是有原因的。他没有提供他正在使用的完整代码,所以我尝试在解决问题的同时尽可能少地进行更改。我已经用忽略该限制的“真实世界”解决方案更新了我的答案。
  • @Borsunho 我使用实例变量是因为我也在其他方法中使用它们。我没有在我的问题中展示这些方法,因为它们大多只是验证输入,而不是真正与问题相关。
  • @SoSimple 您可能需要在这里小心,因为循环正在更改这些实例变量。如果你调用这个方法,当你以后调用使用这些相同变量的其他方法时,变量仍然会改变。
  • @Ajedi 是的,我现在已经意识到了。我真的很傻,没有早点看到它!不过谢谢你的解释,真的很有帮助。我认为我会坚持使用.each 循环——这似乎是更容易接受的做事方式。也是的,我知道转置:)
猜你喜欢
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2014-12-05
相关资源
最近更新 更多