每n个元素分组

时间:2016-06-12 11:46:53

标签: arrays ruby

我有一个数组:

a = [1,2,3,4,5,6]

我想要一个数组数组,使元素达到一定的数量,如:

b = group(a,4) = [[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6],[5,6],[6]]

我试过了:

a.each_cons(4) {|x1,x2,x3,x4| b[a.index(x1) = [x1,x2,x3,x4]}

但结果数组没有最后三个元素:

[[1, 2, 3, 4],[2, 3, 4, 5],[3, 4, 5, 6]]

2 个答案:

答案 0 :(得分:2)

a = [1,2,3,4,5,6]
a.map.with_index { |e, i| a.slice(i, 4) }
#⇒ [1, 2, 3, 4]
#⇒ [2, 3, 4, 5]
#⇒ [3, 4, 5, 6]
#⇒ [4, 5, 6]
#⇒ [5, 6]
#⇒ [6]

答案 1 :(得分:0)

a = [1,2,3,4,5,6]

asize = a.size
  #=> 6 
a.each_index.map { |i| a[i, [4, asize-i].min] }
  #=> [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6], [5, 6], [6]]

步骤如下。

asize = a.size
  #=> 6 
enum0 = a.each_index
  #=> #<Enumerator: [1, 2, 3, 4, 5, 6]:each_index> 
enum1 = enum0.map
  #=> #<Enumerator: #<Enumerator: [1, 2, 3, 4, 5, 6]:each_index>:map> 

仔细查看enum.map的返回值。您将看到它可以被视为复合枚举器。

我们可以看到enum1通过将其转换为数组而生成的元素。

enum1.to_a
  #=> [0, 1, 2, 3, 4, 5] 

我们现在可以将enum1生成的每个元素传递给映射块。

i = enum1.next
  #=> 0
a[i, [4, asize-i].min]
  #=> a[0, [4, 6].min]
  #=> a[0, 4]
  #=> [1,2,3,4]

因此a的第一个元素1被映射到[1,2,3,4]

其余步骤如下。

i = enum1.next         #=> 1 
a[i, [4, asize-i].min] #=> [2, 3, 4, 5] 

i = enum1.next         #=> 2 
a[i, [4, asize-i].min] #=> [3, 4, 5, 6] 

i = enum1.next         #=> 3 
a[i, [4, asize-i].min] #=> [4, 5, 6] 

i = enum1.next         #=> 4 
a[i, [4, asize-i].min] #=> [5, 6] 

i = enum1.next         #=> 5 
a[i, [4, asize-i].min] #=> [6] 

i = enum1.next         #=> StopIteration: iteration reached an end