Как заменить элемент массива? - PullRequest
26 голосов
/ 10 ноября 2009

Как заменить элемент в массиве?

a = [1,2,3,4,5]

Мне нужно заменить 5 на [11,22,33,44].flatten!

так что a теперь становится

a = [1,2,3,4,11,22,33,44]

Ответы [ 8 ]

43 голосов
/ 10 ноября 2009

Не уверен, хотите ли вы заменить определенное значение или нет, но это работает:

a = [1, 2, 3, 4, 5]
b = [11, 22, 33, 44]
a.map! { |x| x == 5 ? b : x }.flatten!

Это перебирает значения a, и когда оно находит значение 5, оно заменяет это значение на массив b, а затем объединяет массивы в один массив.

18 голосов
/ 10 ноября 2009

Возможно, вы имеете в виду:

a[4] = [11,22,33,44] # or a[-1] = ...
a.flatten!

Функциональное решение может быть лучше, как на счет:

a[0..-2] + [11, 22, 33, 44]

что дает ...

=> [1, 2, 3, 4, 11, 22, 33, 44]
14 голосов
/ 01 октября 2011

Версия bta с использованием a.index (5) является самой быстрой:

a[a.index(5)] = b if a.index(5) # 5.133327 sec/10^6

Как минимум на 10% быстрее, чем Райан Макгири :

a.map!{ |x| x == 5 ? b : x } # 5.647182 sec/10^6

Однако обратите внимание, что a.index (5) возвращает только первый индекс, где найдено 5. Итак, учитывая массив, где 5 появляется более одного раза, результаты будут другими:

a = [1, 2, 3, 4, 5, 5]
b = [11,22,33,44]

a[a.index(5)] = b if a.index(5)
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 5]

a.map!{ |x| x == 5 ? b : x }
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 11, 22, 33, 44]
6 голосов
/ 27 февраля 2014

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

a.push 11,22,33,44 if a.delete 5
5 голосов
/ 10 ноября 2009

Этот вариант найдет 5 независимо от того, где он находится в массиве.

a = [1, 2, 3, 4, 5]
a[a.index(5)]=[11, 22, 33, 44] if a.index(5)
a.flatten!
5 голосов
/ 10 ноября 2009

Вы действительно не должны сглаживать, если просто объединяете. Обрежьте последний элемент первого массива и объедините их:

a = [ 1, 2, 3, 4, 5 ]           #=> [1, 2, 3, 4, 5]
t = [11, 22, 33, 44]            #=> [11, 22, 33, 44]
result = a[0..-2] + t           #=> [1, 2, 3, 4, 11, 22, 33, 44]

a [0 ..- 2] - операция среза, которая принимает все элементы, кроме последнего, в массиве.

Надеюсь, это поможет!

1 голос
/ 27 марта 2014

Вот еще один простой способ заменить значение 5 в массиве:

a[-1, 1] = [11, 22, 33, 44]

Используется метод Array#[]=. Я не совсем уверен, почему это работает.

0 голосов
/ 10 ноября 2009

gweg, не уверен, что ты здесь пытаешься сделать, но ты ищешь что-то подобное?

a = [1, 2, 3, 4, 5]
a.delete_at(4)
a = a.concat([11,22,33,44])

Есть несколько способов сделать это - я не думаю, что приведенный выше код выглядит особенно привлекательно. Все зависит от значения «5» в исходном массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...