2 массивы массивов:Сделать 2 массивы одинакового размера
a = [[1, 2], [22, 11], [18, 9]]
b = [[1, 81]]
Какой самый лучший способ для заполнения 2-ым с [0,0], так что они имеют одинаковый размер?
2 массивы массивов:Сделать 2 массивы одинакового размера
a = [[1, 2], [22, 11], [18, 9]]
b = [[1, 81]]
Какой самый лучший способ для заполнения 2-ым с [0,0], так что они имеют одинаковый размер?
b.fill(b.size..a.size - 1) { [0, 0] }
На мой взгляд, это более читаемым:
(a.length - b.length).times do
b << [0, 0]
end
С точки зрения ясности, это лучшее решение. – Drenmi
Мне нравится fill
, но это, кажется, были приняты. Вот способ вернуть желаемый массив без мутации b
. Это не просили, но это может быть полезно в некоторых приложениях:
Array.new(a.size) { |i| b[i] || [0,0] }
#=> [[1, 81], [0, 0], [0, 0]]
Можно, конечно, поставить b =
впереди.
Другой на месте способ:
b.concat [[0,0]]*(a.size-b.size)
Эй, это весело. Другой (не предполагающая никаких элементов b
равной nil
):
a.each_index { |i| b[i] ||= [0,0] }
b
'Если b нужно изменить на месте, поставьте b = спереди.' - это не на месте, оно переназначается. –
Вы правы. Благодарю. Я сделал редактирование. –
Не самый эффективный, но довольно читаемым:
b << [0,0] until a.size == b.size
Немного более эффективным:
b.concat [[0,0]] * (a.size-b.size)
Я бы append
while
размер меньше, потому что я думаю, что он хорошо читается:
a = [[1, 2], [22, 11], [18, 9]]
b = [[1, 81]]
b << [0, 0] while b.size < a.size
b #=> [[1, 2], [0, 0], [0, 0]]
Хороший ответ. Я не знал о форме [Array # fill] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-fill), которая принимает диапазон в качестве аргумента. Интересно, что это работает даже тогда, когда 'b.size> a.size' (который, я думаю, является свойством Range). Вы могли бы, конечно, написать '(b.size ... a.size)'. –