2016-01-27 2 views
4

У меня есть массив Ruby [1, 4]. Я хочу вставить еще один массив [2, 3] в середине, чтобы он стал [1, 2, 3, 4]. Я могу достичь этого с помощью [1, 4].insert(1, [2, 3]).flatten, но есть ли лучший способ сделать это?Как вставить массив в середине массива?

+0

Что именно означает «в середине»? Учитывая вход '[1,1,4,4]', следует ли '[2,3]' вставлять туда? – mudasobwa

+0

«Где» должна быть переменная. Я хочу иметь возможность вставлять в начале или в любом месте посередине, но не в конец (чего легко достичь с помощью массива array1 + array2). – Andree

ответ

9

Вы можете сделать это следующим образом.

[1,4].insert(1,*[2,3]) 

Метод insert() обрабатывает несколько параметров. Поэтому вы можете преобразовать свой массив в параметры с помощью оператора splat *.

+0

Все ответы, которые я получил, замечательные, но я думаю, что ваш самый легкий для чтения. Благодаря! – Andree

+2

Возможно, стоит отметить, что '[1,4] .insert (2, * [2,3]) # => [1,4,2,3]', что позволяет вставлять элементы второго массива после последний элемент первого массива. –

3
def insert_array receiver, pos, other 
    receiver.insert pos, *other 
end 

insert_array [1, 4], 1, [2, 3] 
#⇒ [1, 2, 3, 4] 

или выше может быть достигнуто за счет monkeypatching в Array класс:

class Array 
    def insert_array pos, other 
    insert pos, *other 
    end 
end 

Я считаю, что это достаточно короткие обозначения, чтобы иметь какой-либо дополнительный синтаксис сахара. Кстати, уплощение результат не является хорошей идеей, так как это приведет к повреждению входного массива, уже имеющие массивы внутри:

[1, [4,5]].insert 1, *[2,3] 
#⇒ [1, 2, 3, [4,5]] 

но:

[1, [4,5]].insert(1, [2,3]).flatten 
#⇒ [1, 2, 3, 4, 5] 
4

Одна из форм метода Array#[]= принимает два аргумента: index и length. Когда последнее равно нулю, а rvalue является массивом, метод вставляет элементы rvalue в приемник до элемент по данному индексу (и возвращает rvalue). Поэтому, чтобы вставить элементы:

b = [2,3] 

в:

a = [1,4] 

до элемента с индексом 1 (4), мы пишем:

a[1,0] = b 
    #=> [2,3] 
a #=> [1,2,3,4] 

Примечание:

a=[1,4] 
a[0,0] = [2,3] 
a #=> [2,3,1,4] 

a=[1,4] 
a[2,0] = [2,3] 
a #=> [1,4,2,3] 

a=[1,4] 
a[4,0] = [2,3] 
a #=> [1,4,nil,nil,2,3]] 

, поэтому местоположение вставки находится перед данным индексом.

+1

Это очень краткий способ вставки элементов другого массива. Может быть, вы должны добавить некоторое объяснение (и некоторые пробелы). – Stefan

0

Мой вариант без массива # вставки метода

array = [1,2,3,6,7,8] 
new_array = [4,5] 

array[0...array.size/2] + new_array + array[array.size/2..-1] 
Смежные вопросы