2016-10-14 4 views
-1

Скажем, у меня есть массив Рубин формы:рубин .each_slice с условием четными и нечетными индексами массива

array = ["zero","first","second","third"] 

Я хочу использовать метод, чтобы разделить этот массив в 2-х новых массивов в том числе даже и нечетные индексы эквивалентно.

Идеальный результат:

newArrayOne = ["zero", "second"] 
newArrayTwo = ["first", "third"] 

используя условие четного или нечетного индекса как логическое значение.

Примечание: массив будет иметь много элементов.

(для парня с грубым комментарием, который считает это лучший программист в живых)

Я попытался each_slice который accepta один аргумент и другие методы, их подписи не позволили мне получить то, что я хочу.

Если предоставленные результаты используют этот конкретный метод в названии вопроса, скажите, что вам нравится !!!

Я не знал о методах, предложенных в комментариях и ответах, поэтому я опубликовал и не изучаю Ruby или Ruby, мне просто нужно было работать с другими людьми, отсутствующими. Счастлив теперь?

+0

'[ "ноль", "первый", "второй",» третий "]. group_by.with_index {| x, i | i% 2} .значения # => [["zero", "second"], ["first", "third"]] ' – bjhaid

+0

спасибо, но можем ли мы иметь два разных одномерных массива? –

+0

'newArrayOne, newArrayTwo = [" zero "," first "," second "," third "]. Group_by.with_index {| x, i | i% 2} .values' – bjhaid

ответ

5
newArrayOne, newArrayTwo = array.partition.with_index { |_,i| i.even? } 
+0

Очень умное использование ['Enumerable # partition] (https://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-partition)! – mudasobwa

+0

Это похоже на ответ @ mudasobwa, опубликованный тремя минутами ранее. Я не сомневаюсь, что вы подошли к нему самостоятельно, но добавили ли вы что-нибудь новое? –

+0

@CarySwoveland Я считаю, что timstott представил параллельное назначение в своем ответе, на который первоначально не ссылался ответ мудасобвы. Я поддержал оба ответа. –

5
["zero","first","second","third"].partition.with_index { |_, i| i.even? } 
#⇒ [["zero", "second"], ["first", "third"]] 

newArrayOne, newArrayTwo = ["zero","first","second","third"] 
          .partition 
          .with_index { |_, i| i.even? } 

newArrayOne 
#⇒ ["zero", "second"] 
0

Я предположил, что, если n = array.size, массив n/2 элементов должен быть возвращен. См. Мой комментарий к вопросу.

array = %w| zero first second third fourth fifth | 
    #=> ["zero", "first", "second", "third", "fourth", "fifth"] 

newArrayOne, newArrayTwo = array.each_slice(array.size/2).to_a.transpose 
    #=> [["zero", "third"], ["first", "fourth"], ["second", "fifth"]] 

Если, однако, массив всегда имеет ровно четыре элемента:

newArrayOne, newArrayTwo = [[array[0], array[2]], [array[1], array[3]]] 
    #=> [["zero", "second"], ["first", "third"]] 
+2

'[" zero "," first "," second "," third "]. Partition {| w | w.length.even? } ':) – mudasobwa

2
newArrayOne, newArrayTwo = ["zero","first","second","third"] 
          .each_slice(2) 
          .to_a 
          .transpose 

или

newArrayOne, newArrayTwo = Hash["zero","first","second","third"] 
          .to_a 
          .transpose 

или:

["zero","first","second","third"].each_with_object([[], []]) do |e, acc| 
    (acc.first.length <= acc.last.length ? acc[0] : acc[1]) << e 
end 

и, конечно же, с помощью flip-flop (мой любимый):

["zero","first","second","third"].each_with_object([[], []]) do |e, acc| 
    flipflop = acc.first.size == acc.last.size 
    (flipflop..flipflop ? acc[0] : acc[1]) << e 
end 
0

Ответ в комментариях обеспечивается @bjhaid

["zero","first","second","third"].group_by.with_index { |x,i| i % 2 }.values 
#=> [["zero", "second"], ["first", "third"]] 
Смежные вопросы