在Ruby中修改前n个元素并返回修改后的数组

4

我需要对数组的 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]

我想用arr2的值替换array的前两个元素,不想创建太多新数组,有什么方法可以实现吗?
3个回答

4
不需要遍历整个数组。
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

您无需将其推送到新数组中,为什么不这样做:

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]

2
你目前的实现有什么问题吗?没有问题,你只需要对数组中的其他元素进行求和即可:
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
  • 你可以使用 map 而不是分配一个 "memo" 数组:
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接