我有一个数组有不同数量的元素0..n元素。一个例子可能是:
a = [0,1,2,3,4,5,6,7,8,9]
在迭代过程中,我想在数组中移动光标并切出最多数量的元素。如果我到达"结束"对于数组,它应该重新开始并从头开始重新选择:
这样的事情:
4.times do |i|
a.slice(i * 3, 3)
end
# i = 0 => [0,1,2]
# i = 1 => [3,4,5]
# i = 2 => [6,7,8]
# i = 3 => [9,0,1]
# ...
然而,最后一个输出i = 3
产生[9]
.slice
并不能完全符合我的要求。
答案 0 :(得分:9)
您可以使用cycle
:
&:after {
position: absolute;
height: 4px;
display: block;
bottom:-20px;
width: 200px;
background: @yellow;
content: '';
}
答案 1 :(得分:2)
您可以使用Array#rotate,然后每次都使用前3个元素:
4.times.each { |i| a.rotate(i*3)[0..2] }
# => [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]]
答案 2 :(得分:1)
可能的解决方案:
4.times { |i| p a.values_at(*(i*3..i*3+2).map {|e| e % 10 }) }
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9, 0, 1]
9%10 = 9,10%10 = 0,11%10 = 1.因此您将获得所需的输出。
答案 3 :(得分:0)
这可能会破坏一些代码,所以要小心。
class Array
alias_method :old_slice, :slice
def slice(o, c)
ret = old_slice(o % size, c)
if ret.size != c
ret += old_slice(0, c - ret.size)
end
ret
end
end
a = [0,1,2,3,4,5,6,7,8,9]
4.times do |i|
p a.slice(i * 3, 3)
end
正如Stephan所指出的那样,给这个方法赋一个不同的名称会更好,或者创建一个CircularArray类可能更好。
class CircularArray < Array
alias_method :straight_slice, :slice
def slice(o, c)
ret = straight_slice(o % size, c)
if ret.size != c
ret += straight_slice(0, c - ret.size)
end
ret
end
end