使用 step 循环遍历数组
Posted
技术标签:
【中文标题】使用 step 循环遍历数组【英文标题】:Looping through an array with 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问题。
【参考方案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(&: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 它运行得更快。我喜欢看我的周期,让....自己照顾他们。 那么,我将把我的if
s 替换为unless
... jk ;)以上是关于使用 step 循环遍历数组的主要内容,如果未能解决你的问题,请参考以下文章