У меня есть следующий код:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Я хочу объединить массив ы
в массив "а", который дал бы мне:
["Cat", "and", "Dog", "&", "Mouse"]
Просмотр руководства Ruby массива и перечисли документы, я не'т см. Такой метод, который позволит достичь этого.
Есть ли способ я могу сделать это без перебора каждого массива?
Вы можете сделать это с:
a.zip(s).flatten.compact
Это выиграл'т дать время приведут в порядок, Крис попросил, но если порядок результирующего массива не'т имеет значения, вы можете просто использовать а |= б
. Если вы Don'т хотим, чтобы мутировать "а", вы можете написать в | Б
и присваивает результат переменной.
Смотрите в документации для класса массива http://www.ruby-doc.org/core/classes/Array.html#M000275.
Этот ответ предполагает, что вы Дон'т хотите, чтобы повторяющиеся элементы массива. Если вы хотите разрешить дублирование элементов в итоговом массиве, а += бследует сделать трюк. Опять же, если вы не'т хотим, чтобы мутировать
а, используйте
А + Б` и присваивает результат переменной.
В ответ на некоторые комментарии на этой странице, эти два решения будут работать с массивами любого размера.
Здесь'ы решение, которое позволяет чередование нескольких массивов разных размеров (общее решение):
arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
["and", "&"],
["hello", "there", "you"]]
first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]
s.inject(a, :<<)
s #=> ["and", "&"]
a #=> ["Cat", "Dog", "Mouse", "and", "&"]
Это не'т дать вам того, что вы просили, но это's приятный способ слияния двух массивов путем добавления к одной.
Это's не очень изящно, но это работает для массивов любого размера:
>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2]
#=> ["Cat", "and", "Dog", "&", "Mouse"]
Как насчет более общее решение, которое работает, даже если первое время это'т дольше и принимает любое количество массивов?
a = [
["and", "&"],
["Cat", "Dog", "Mouse"]
]
b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact
=> ["Cat", "and", "Dog", "&", "Mouse"]
Один из способов сделать чередования, а также гарантия, которая является большой массив для метода молнии, завалить одного из массивов с нуля
до тех пор, пока размер массива. Таким образом, вы также гарантировать, что элемент массива будет на первой позиции:
preferred_arr = ["Cat", "Dog", "Mouse"]
other_arr = ["and","&","are","great","friends"]
preferred_arr << nil while preferred_arr.length < other_arr.length
preferred_arr.zip(other_arr).flatten.compact
#=> ["Cat", "and", "Dog", "&", "Mouse", "are", "great", "friends"]
Для обработки ситуации, когда и А
& ы
не одинакового размера:
a.zip(s).flatten.compact | s
.компактный
удаляет ноль
, когда а
больше, чем ы
| S
будет добавить оставшиеся элементы от S
, когда а
меньше, чем ы
arr = [0, 1]
arr + [2, 3, 4]
//outputs [0, 1, 2, 3, 4]