【问题标题】:Looping through an array with step使用 step 循环遍历数组
【发布时间】:2012-10-12 21:00:49
【问题描述】:

我想查看数组中的每个第 n 个元素。在 C++ 中,我会这样做:

for(int x = 0; x<cx; x+=n){
    value_i_care_about = array[x];
    //do something with the value I care about.  
}

我想在 Ruby 中做同样的事情,但找不到“步进”的方法。 while 循环可以完成这项工作,但我发现在已知大小的情况下使用它令人反感,并希望有更好(更多 Ruby)的方式来执行此操作。

【问题讨论】:

  • 找不到有关该步骤的任何信息
  • 本杰明的回答不正确。你应该看看李维斯或大卫的答案。
  • 是的,1.step(3, 2) 给出 1 和 3 是有道理的。在这段代码中,步长为 2,因此第二个元素被跳过。剩下的是 1 和 3。
  • 是的,我知道它现在是如何工作的了。谢谢大家。
  • 顺便说一句,这与Rails无关,是一个Ruby问题。

标签: ruby loops iteration


【解决方案1】:

怎么样:

> [1, 2, 3, 4, 5, 6, 7].select.each_with_index { |_,i| i % 2 == 0 }
=> [1, 3, 5, 7]

迭代器的链接非常有用。

【讨论】:

  • 嗯,也许,但在这种情况下完全没有必要。只需使用 select 的块形式:[1, 2, 3, 4, 5, 6, 7].select(&amp;:odd?)
【解决方案2】:

只需使用 Range 类中的 step() 方法,该方法返回一个枚举器

(1..10).step(2) {|x| puts x}

【讨论】:

  • 不错。不喜欢创建一百万个范围的想法,而 int 可以在 c++ 中完成这项工作。但是很酷
【解决方案3】:
class Array
def step(interval, &block)
    ((interval -1)...self.length).step(interval) do |value|
        block.call(self[value])
    end
end
end

您可以将方法添加到类数组中

【讨论】:

    【解决方案4】:

    范围有一个 step 方法,您可以使用它来跳过索引:

    (0..array.length - 1).step(2).each do |index|
      value_you_care_about = array[index]
    end
    

    或者,如果您喜欢使用带有范围的 ...,以下内容会更简洁:

    (0...array.length).step(2).each do |index|
      value_you_care_about = array[index]
    end
    

    【讨论】:

    • 你可以用(0...array.length)代替(0..array.length - 1)
    【解决方案5】:
    array.each_slice(n) do |e, *_|
      value_i_care_about = e
    end
    

    【讨论】:

      【解决方案6】:

      我们可以在每次迭代时跳过一系列数字进行迭代,例如:

      1.step(10, 2) { |i| print "#{i} "}
      

      http://www.skorks.com/2009/09/a-wealth-of-ruby-loops-and-iterators/

      比如:

      array.step(n) do |element|
        # process element
      end
      

      【讨论】:

      • 您错过了有关该步骤的信息。这是最重要的一点。
      • 今晚感觉有点不舒服=D
      • 这不起作用。 Array 没有 step 方法,因此您将获得“未定义的步骤方法”。 1.step(10,2) 确实有效,但不会遍历数组。李维答对了。
      • 是的.. 但在 Ben 的防守中.. 就足够了。 Levi's 也不会遍历数组。两个很好的答案。
      【解决方案7】:

      这是使用模运算符%的一个很好的例子

      当您掌握了这个概念后,您可以将它应用到大量不同的编程语言中,而无需深入了解它们。

      step = 2
      ["1st","2nd","3rd","4th","5th","6th"].each_with_index do |element, index|
        puts element if index % step == 1
      end
      
      #=> "2nd"
      #=> "4th"
      #=> "6th"
      

      【讨论】:

      • 不得不投票给你...如果 n 是 1000,那么我有 10000 个元素,我刚刚完成了 10000 个元素,如果我不需要获得 10 个元素。
      • 我只是想知道为什么它被否决了。谢谢你告诉我
      • 当然你说得对。负面影响越大,您的步长越大。如果您像我刚才一样对此感到好奇,请参阅以下要点中的重要基准测试结果:gist.github.com/3936015
      • 优秀的搜索戴夫。每当比较在循环中时,它每次都会运行..如果你可以让 if's out of your loop 它运行得更快。我喜欢看我的周期,让....自己照顾他们。
      • 那么,我将把我的ifs 替换为unless... jk ;)
      猜你喜欢
      • 2019-08-13
      • 2013-11-23
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      相关资源
      最近更新 更多