2016-08-03 5 views
-2

Учитываясделать несколько массивов в один массив

arr = [5,6,7] 
aa = [1,2,3,arr,8,9] 

Я хочу для создания массива

b = [[1,2,3,5,8,9], [1,2,3,6,8,9], [1,2,3,7,8,9]] 

Обратите внимание, что все три элемента b начинаются с элементами aa, которые предшествуют arr (далее " новичков ") и заканчиваются элементами aa, которые следуют за arr (« enders »). i-й элемент arr затем вставлен в i й элемент b, между «новичками» и «конечными пользователями». Размер b поэтому равен размеру arr.

В общем случае элементы aa, предшествующие или последующие arr, могут быть любыми объектами, отличными от массивов (не обязательно целыми числами).

Примечание: Оригинальное изложение этого вопроса было

aa = [1,2,3,arr,8] 

и намерение состояло в том, чтобы произвести массив

b = [[1,2,3,5,8],[1,2,3,6,8],[1,2,3,7,8]] 

Вот почему некоторые ответы не отражают пересмотренный пример выше.

+0

sonukrishna, я взял на себя смелость разъяснения своего вопроса в соответствии с моим пониманием того, что вы хотите сделать. Мое понимание разделяют все, кто предложил решение на сегодняшний день. Я верю, что это то, что вы хотите сделать. –

+1

@CarySwoveland Я поделился пониманием вас и других, кто ответил. Я не нашел этот вопрос непонятным; Я хочу, чтобы избиратели оставили комментарий, говоря, что им было непонятно. –

ответ

1

Попробуйте это:

nested = aa.select { |ele| ele.is_a? Array }.flatten 
aa = aa.select { |ele| !ele.is_a? Array } 
result = [] 
nested.each { |ele| result << ([aa + [ele]].flatten.sort) } 
0

Может быть, вы можете использовать что-то вроде этого:

arr = [1, 2, 3, [5, 6, 7], 8] 

# get fixnum 
numbers = arr.select { |i| !(Array === i) } 

output = arr.each.with_index.with_object(Array.new([])) do |(a, i), exp| 
    a.each { |k| exp << numbers.dup.insert(i, k) } if Array === a 
end 

p output 
# => [[1, 2, 3, 5, 8], [1, 2, 3, 6, 8], [1, 2, 3, 7, 8]] 
2
▶ max_sz = aa.map { |e| [*e].size }.max 
#⇒ 3 
▶ aa.map { |e| e.is_a?(Array) ? e : [e] * max_sz }.transpose 
#⇒ [[1,2,3,5,8],[1,2,3,6,8],[1,2,3,7,8]] 

или, может быть, более ясное:

▶ aa.map { |e| ([*e] * max_sz).take(max_sz) }.transpose 
+0

Спасибо, дорогая, его отличная помощь – sonukrishna

0
first, mid, last = aa.chunk(&:class).map { |_,e| e.flatten } 
    #=> [[1, 2, 3], [5, 6, 7], [8]] 
[first].product(mid.product([last])).map(&:flatten) 
    #=> [[1, 2, 3, 5, 8], [1, 2, 3, 6, 8], [1, 2, 3, 7, 8]] 

шаги являются

enum = aa.chunk(&:class) 
    #=> #<Enumerator: #<Enumerator::Generator:0x007ff64a1699f8>:each> 

Мы можем увидеть элементы, которые будут генерироваться этим счетчику путем преобразования его в массив.

enum.to_a 
    #=> [[Fixnum, [1, 2, 3]], [Array, [[5, 6, 7]]], [Fixnum, [8]]] 

Продолж,

first, mid, last = enum.map { |_,e| e.flatten } 
    #=> [[1, 2, 3], [5, 6, 7], [8]] 
first 
    #=> [1, 2, 3] 
mid 
    #=> [5, 6, 7] 
last 
    #=> [8] 

a = mid.product([last]) 
    #=> [[5, [8]], [6, [8]], [7, [8]]] 
b = [first].product(a) 
    #=> [[[1, 2, 3], [5, [8]]], 
    # [[1, 2, 3], [6, [8]]], 
    # [[1, 2, 3], [7, [8]]]] 
b.map(&:flatten) 
    #=> [[1, 2, 3, 5, 8], 
    # [1, 2, 3, 6, 8], 
    # [1, 2, 3, 7, 8]] 
Смежные вопросы