在所有嵌套数组中的第二个元素中添加x的更快方法

问题描述 投票:0回答:2

我在ruby中有一个嵌套数组,与下面的类似,但是还有很多嵌套数组。

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

是否有一种方法可以获取嵌套数组中的每个第二个元素,并将x添加到该元素?我使用了下面的代码,但是如果我想知道一种更快的方法。

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]]

arrays ruby
2个回答
0
投票

每当您发现自己一遍又一遍地编写此类代码时,就应该使用循环! Ruby通常使用iterators进行循环。 Array#each是一个遍历数组的迭代器,可让您一次对每个元素进行操作。

由于您知道要在每个元素的第二个元素中添加x,所以这很简单:

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

此将arr(和arr的子数组)替换到位。如果要返回变异的副本,则可以使用map,它类似于each,但返回值是该块的输出,而不是该块的输入

# 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
投票

您接近了!您可以使用map遍历每个子数组,并使用ruby +=运算符将x添加到每个子数组的第二个元素中。 map的技巧是,您需要在每个循环中返回entire子数组,如下所示:

arr.map { |a| a[1] += x; a }
#=> [[1, 7, 3], [4, 10, 6], [7, 13, 9]]
© www.soinside.com 2019 - 2024. All rights reserved.