圆阵列切片

时间:2017-04-04 12:34:17

标签: arrays ruby

我有一个数组有不同数量的元素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并不能完全符合我的要求。

4 个答案:

答案 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