Более быстрый способ добавления x к каждому второму элементу во всех вложенных массивах - PullRequest
1 голос
/ 30 октября 2019

У меня есть вложенный массив в ruby, похожий на приведенный ниже, но с еще несколькими вложенными массивами.

arr=[[1,2,3],[4,5,6],[7,8,9]]

Есть ли способ получить каждый второй элемент во вложенном массиве, идобавить х к этому элементу? Я использовал приведенный ниже код, но если есть более быстрый способ, который я хотел бы узнать.

x = 5
arr[0][1], arr[1][1], arr[2][1] = arr[0][1]+x, arr[1][1]+x, arr[2][1]+x

Я уже пытался использовать arr.map!{|f,l| [f, l + 1]}, но я получил результатarr == [[1, 3], [4, 6], [7, 9]]

РЕДАКТИРОВАТЬ:

Таким образом, результат должен быть arr == [[1,2+x,3],[4,5+x,6],[7,8+x,9]]

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Ты близко! Вы можете использовать map для обхода каждого подмассива и оператор ruby ​​+= для добавления x ко второму элементу каждого. Хитрость с map заключается в том, что вам нужно будет возвращать весь подмассив в каждом цикле, который будет выглядеть так:

arr.map { |a| a[1] += x; a }
#=> [[1, 7, 3], [4, 10, 6], [7, 13, 9]]
2 голосов
/ 30 октября 2019

Каждый раз, когда вы снова и снова пишете такой код, вы должны использовать цикл! Ruby обычно использует итераторы для выполнения циклов. Array # each является итератором, который зацикливается на массиве и позволяет вам работать с каждым элементом по одному.

Поскольку вы знаете, что хотите добавить x ко второму элементу вкаждый, это тривиально:

arr.each {|e| e[1] += x }

Это мутирует arrarr подмассивы) на месте. Если вы хотите вернуть измененную копию, вы должны использовать map, что похоже на each, за исключением того, что возвращаемым значением является выход блока, а не input дляэто.

# First we clone each subarray with Array#dup, then we iterate the
# clones, adding x to the second element. Because we're using `map`
# the result will be a new array, rather than the original arr, leaving
# the original unmodified.
new_arr = arr.map(&:dup).each {|e| e[1] += x }
0 голосов
/ 30 октября 2019

Вот еще один:

arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x = 5

arr.map { |a, b, c| [a, b + x, c] }
#=> [[1, 7, 3], [4, 10, 6], [7, 13, 9]]

Обратите внимание, что map возвращает новый массив. Если вы хотите изменить существующий массив, есть map!.

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