2016-06-12 2 views
1

У меня есть массив:группы каждый п элементов

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
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] 
+0

большое спасибо @mudasobwa. Я задаю вопрос о методе уровня 2 'array.map.with_index'. Как он обрабатывается? –

+0

'a.each_index.map' более прост. – sawa

+0

или '{| _, i | a [i..i + 4]} ', без' slice' – Ilya

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 
+0

Этот ответ появился в очереди просмотра низкого качества, по-видимому, потому, что вы не предоставляете никаких объяснений кода. Если этот код отвечает на вопрос, подумайте над добавлением добавления текста, объясняющего код в вашем ответе. Таким образом, вы, скорее всего, получите больше бонусов - и помогите исследователю узнать что-то новое. – lmo

Смежные вопросы