3

可能重复:
ruby:对两个数组的对应成员求和

所以我正在努力做到这一点。

我正在尝试添加两个数组并将结果放入第三个数组中。现在我希望能够通过一个函数来做到这一点。

所以我有 Array_One、Array_Two 和 Array_Three。我想将“比较函数”调用为 1 和 2 并使 3 具有相同的长度,然后如果它们的长度匹配,我想添加 1 和 2 并将结果放入 3 中。

这可以在一个功能中完成吗?更好的方法来做到这一点?这是我的思考过程,但我没有 Ruby 的知识来做到这一点。

编辑:抱歉含糊不清。

Array_One = [3,4]
Array_Two = [1,3]
Array_Three= []

我想通过一个比较长度并验证它们长度相同的函数传递一个和两个。然后,在我看来,我会通过一个实际执行添加的函数来发送它。所以最后我会有 Array_Three = [4,7] 希望有帮助。

4

4 回答 4

5

您的问题的描述有点令人困惑,但我认为这可能是您想要的:

def add_array(a,b)
  a.zip(b).map{|pair| pair.reduce(&:+) }
end

irb> add_array([1,2,3],[4,5,6])
=> [5, 7, 9]

此外,它很容易推广到添加多个数组:

def add_arrays(first_ary, *other_arys)
  first_ary.zip(*other_arys).map{|column| column.reduce(&:+) }
end

irb> add_arrays([1,2,3],[4,5,6])
=> [5, 7, 9]
irb> add_arrays([1,2,3],[4,5,6],[7,8,9])
=> [12, 15, 18]
于 2012-10-25T23:06:56.977 回答
3

如果通过添加您的意思是按元素添加,那么您可以使用:

def add(a, b)
  a.zip(b).map &:sum
end

假设您的环境已sum定义。

Sum 是 的别名reduce(&:+),您可以使用它来代替。

zip是一个函数,它接受两个数组并返回一个数组数组:

[a1, a2, a3, ..., an].zip [b1, b2, b3, ..., bm] 
   #=> [[a1, b1], [a2, b2], [a3, b3], ..., [an, bn]]
   # assuming n <= m

我们将我们的数组数组和该数组中的所有数字相加,然后使用 map 收集结果。

map是一个接受一个块并产生一个数组的函数:

[c1, c2, c3, ..., cn].map &block
  # => [block.call(c1), block.call(c2), block.call(c3), ..., block.call(cn)]

所以如果我们得到示例输入说

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

a.zip(b)            #=> [[1,4], [2,2], [3,5]]
a.zip(b).map(&:sum) #=> [[1,4].sum, [2,2].sum, [3,5].sum] #=> [5, 4, 8]

现在我们可以使用 if 条件检查相同的长度:

def add(a, b)
  a.zip(b).map &:sum if a.size == b.size
end
于 2012-10-25T23:21:54.353 回答
3

假设我理解您的问题,一种可能的方法(无需任何检查):

x = [1, 2, 3]
y = [4, 5, 6]
z = []
x.each_with_index do |v, i|
  z << v + y[i]
end

另一种方法(仍然假设我理解了这个问题):

[x, y].transpose.map {|v| v.reduce(:+)}
于 2012-10-25T23:03:17.430 回答
1

如果要添加两个数组,只需添加它们:

array1 = [1, 2, 3]
array2 = ['a', 'b', 'c']

if array1.length == array2.length
  array3 = array1 + array2
end

# array3 = [1, 2, 3, 'a', 'b', 'c']
于 2012-10-25T23:05:53.077 回答