【问题标题】:Modify particular items in array while traversing in reverse order in Ruby在Ruby中以相反顺序遍历时修改数组中的特定项目
【发布时间】:2017-04-07 02:46:44
【问题描述】:

有没有办法修改特定的数组元素(基于某些条件),同时在 Ruby 中以相反的顺序遍历它?

为了更清楚,让我们说,

问题是用 x 替换 [1,2,3,4,5] 中的偶数

输出应该是 [1,x,3,x,5](相同的数组),但替换应该从右到左发生..从 5 到 1 遍历。

提前致谢!

这有效:(arr.length -1).downto(0) { |x|用 arr[x] }

做点什么

【问题讨论】:

  • 你的意思是收藏!但反过来呢?
  • 是的,我注意到了这张地图,从左到右收集工作,因为它们又依赖于每个,但我想从右到左修改..我只想知道是否有任何现有的方法来做到这一点,而不是编写自定义代码。遍历我们有 reverse_each 但找不到任何要修改的东西:(
  • 你有什么理由不能只使用my_array.reverse.map{} 吗?如果您想再次将其放回原处,只需在末尾添加另一个.reverse
  • 但您不想保留输出,对吧?只有遍历顺序必须相反?并且您希望更新始终到位?
  • @Isotope reverse 是我想避免的额外性能开销。

标签: ruby arrays reverse traversal


【解决方案1】:
p [1,2,3,4,5].reverse_each.map{|e| e.odd? ? e : e/2} #[5, 2, 3, 1, 1]

【讨论】:

  • 但这会反转数组并且它不是就地的,我认为这就是 OP 想要的。
【解决方案2】:

我了解您想以相反的顺序遍历,而不是使输出也反转。也许是这样:

xs = [1, 2, 3]
xs.reverse_each.with_index { |x, idx| xs[xs.size-1-idx] = x.to_s if x == 2 }
xs #=> [1, "2", 3]

【讨论】:

  • xs 在使用 map 而不是 map! 时不会像您显示的那样。
  • @Michael:哎呀,是的,它是一个枚举器……嗯,也许每个都有。
  • @tokland 谢谢!它有效:) 我想不出它,因为我想避免基于索引的访问..看起来它无法避免。
  • @tokland 但是在使用它时应该小心,因为索引从 0 开始假设你的 x 是 3 但是如果你尝试使用 xs[idx] 替换 1 被修改,因为你的 x = 3 的 idx 是0 在这种情况下..如果我错了请纠正我:)
  • 确实,固定,索引也必须“反转”
【解决方案3】:

我欣赏并喜欢 Ruby 的人性化语法,但您可能需要考虑更详细的选项,例如:

ary = [1,2,3,4,5]
i = ary.count - 1
while i >= 0 do
    ary[i] = "x" if ary[i] % 2 == 0
    i -= 1
end
puts ary.join(",")

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 2010-10-06
    • 2011-01-07
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多