【问题标题】:Iteration for select and modify in ruby [closed]ruby中选择和修改的迭代[关闭]
【发布时间】:2013-07-27 18:53:15
【问题描述】:

我有类似的代码

@a.each{ |n|
   if n == i then
      @b.push n
      n = 2*n
   end
}

我想遍历一个数组@a,如果某个条件n == i为真,那么使用当前元素n@b.push n,然后将其更新为n = 2*n。如何迭代选择和修改?

【问题讨论】:

  • 你能澄清一下“更新它......就地”吗?你的意思是你希望@a 中的n 的值被2*n 替换,这样@a 现在持有2*n 而不是n
  • 为什么就地而不是新数组?输入数组是巨大的吗?
  • 修改n 的值似乎违背了在@a 上迭代n 的目的。你的意图不明确。
  • @mbratch,是的。正是

标签: ruby iteration


【解决方案1】:
@a.each.with_index do |n, j|
  next unless n == i
  @b.push(i)
  @a[j] = 2 * i
end

【讨论】:

    【解决方案2】:

    如果数组很大,NArray 可以非常快地做到这一点:

    require 'narray'
    
    # Some sample data:
    a = NArray.int(100000).random(10)
    
    i = 8
    # b is a "boolean" array that can be used to select or modify
    # only certain elements in a
    b = a.eq i 
    
    a[b] *= 2
    

    如果您的初始数组 @a 很大,并且您担心性能,您可能想尝试一下。

    【讨论】:

      【解决方案3】:

      使用each_with_index 解决问题

      @a.each_with_index{ |n,q|
         if n == i then
            @b.push n
            @a[q] = 2*n
         end
      }
      

      【讨论】:

        【解决方案4】:
        @a.each_with_index do |n, x|
          if n == i
            @b.push n
            @a[x] = 2*n
          end
        end
        

        【讨论】:

          【解决方案5】:

          希望下面的工作:

          @a.map!{|n| n == i ? (@b.push n; 2*n) : n }
          

          【讨论】:

            猜你喜欢
            • 2015-01-31
            • 1970-01-01
            • 2021-04-05
            • 2023-04-06
            • 1970-01-01
            • 2012-01-11
            • 2013-02-22
            • 2014-01-13
            • 1970-01-01
            相关资源
            最近更新 更多