У меня такой код:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Я хочу объединить массив s
в массив, a
который даст мне:
["Cat", "and", "Dog", "&", "Mouse"]
Просматривая документы Ruby Array и Enumerable, я не вижу такого метода, который позволил бы это сделать.
Есть ли способ сделать это без перебора каждого массива?
Ответы:
Вы можете сделать это с помощью:
источник
a
элементов больше 3?[a, s].transpose
, чтобы две строки не соответствовали друг другу, оставив#zip
очевидное решение. И я не верю, что он имел в виду, что его действительно заботило,a
был ли мутирован ... Я не думаю, что он вообще комментировал мутированное и функциональное решение, он просто пытался описать шаблон.Это не даст результирующий массив в том порядке, который запрашивал Крис, но если порядок результирующего массива не имеет значения, вы можете просто использовать
a |= b
. Если вы не хотите мутироватьa
, вы можете записатьa | b
и присвоить результат переменной.См. Документацию по объединению набора для класса Array по адресу http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Этот ответ предполагает, что вам не нужны повторяющиеся элементы массива. Если вы хотите разрешить дублирование элементов в окончательном массиве, это
a += b
должно помочь. Опять же, если вы не хотите изменятьa
, используйтеa + b
и присвойте результат переменной.В ответ на некоторые комментарии на этой странице, эти два решения будут работать с массивами любого размера.
источник
["Cat", "Dog", "Mouse", "and", "&"]
, что не то, что хотел OP.Если вы не хотите дублировать, почему бы просто не использовать оператор объединения :
источник
s
будут в конце нового массива.Он не дает вам того порядка, который вы просили, но это хороший способ объединения двух массивов путем добавления к одному.
источник
Вот решение, которое позволяет чередовать несколько массивов разного размера (общее решение):
источник
Это не совсем элегантно, но работает для массивов любого размера:
источник
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
было бы в равной степени справедливо.and
и&
, таким образом , я взял его в буквальном смысле , как это возможно, допуская при этомa
любой длины.Как насчет более общего решения, которое работает, даже если первый массив не самый длинный и принимает любое количество массивов?
источник
Чтобы справиться с ситуацией, когда оба
a
&s
имеют разные размеры:.compact
удалит,nil
когдаa
больше чемs
| s
добавит оставшиеся элементы,s
когдаa
меньше чемs
источник
Один из способов сделать чередование, а также гарантировать, какой из них является самым большим массивом для метода zip, - это заполнить один из массивов
nil
до тех пор, пока не будет размер другого массива. Таким образом, вы также гарантируете, какой элемент какого массива будет на первой позиции:источник
preferred_arr.zip(other_arr).flatten | other_arr
(без обратной засыпки нуля)источник