Измените только первые n элементов и верните измененный массив в ruby - PullRequest
2 голосов
/ 12 июля 2020

Мне нужно выполнить операцию с k набором значений массива и вернуть измененный массив.

У меня есть array = [10,32,5,6,7]

Допустим, k=2

Я пытаюсь взять здесь только первые два элемента, выполнив:

arr2=[]
array[0..k-1].each do |i|
 res=i.to_f/2.0
 arr2.push(res.round)
end

=>arr2=[5,16]

Я хочу заменить первые 2 элемента в array значениями arr2. Как я могу добиться этого, не создавая так много новых массивов.

Ответы [ 3 ]

3 голосов
/ 12 июля 2020

Нет необходимости перебирать весь массив.

array = [10,32,5,6,7]

array[0, 2] = array[0, 2].map { |n| n/2.0 }
array
  #=> [5.0, 16.0, 5, 6, 7] 

или

2.times { |i| array[i] = array[i]/2.0 }
array
  #=> [5.0, 16.0, 5, 6, 7] 

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

array[0, 2].map { |n| n/2.0 }.concat(array[2..-1])
  #=> [5.0, 16.0, 5, 6, 7] 
array
  #=> [10, 32, 5, 6, 7] 
2 голосов
/ 12 июля 2020

Что не так с вашей текущей реализацией? Ничего, вам просто нужно суммировать другие элементы из массива:

arr2=[]
array[0..k-1].each do |i|
 res=i.to_f/2.0
 arr2.push(res.round)
end
arr2 + array[k..-1] # [5, 16, 5, 6, 7]
  • Каждый раз, когда вы делаете integer.to_f / ..., вы можете сделать fdiv.
  • Вместо присвоения " memo ", вы можете использовать map:
arr2 = array[0..k-1].map do |i|
  res=i.to_f/2.0
  res.round
end + array[k..-1]
arr2 # [5, 16, 5, 6, 7]
  • Вместо того, чтобы делать k - 1 для получения диапазона, вы можете использовать эксклюзивный диапазон 0...k.

Ваш код будет выглядеть (без изменения array):

array[0...k].map { |i| i.fdiv(2.0).round } + array[k..-1] # [5, 16, 5, 6, 7]
2 голосов
/ 12 июля 2020

Вам не нужно преобразовывать sh в новый массив, почему бы не сделать:

array = [10,32,5,6,7]
k = 2

array[0..k-1].each_with_index do |val, indx|
  array[indx] = val / 2 # or whatever processing really
end

Это простой способ решить вашу проблему, поскольку .each_with_index выполняет здесь работу и позволяет вы можете легко изменить исходный массив. Это выведет:

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