Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 不同大小数组的总和_Ruby On Rails_Arrays_Ruby - Fatal编程技术网

Ruby on rails 不同大小数组的总和

Ruby on rails 不同大小数组的总和,ruby-on-rails,arrays,ruby,Ruby On Rails,Arrays,Ruby,我有一个数组,它的元素是不同大小的数组,比如: [[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]] 我想求两个数组的和,即 [49, 151, ...] 您可以使用以下内容: a.flat_map{|x| x.in_groups_of(a.max_by(&:size).size, 0)}.transpose.map(&:sum) 或者这个: a.max_by(&:size).map.w

我有一个数组,它的元素是不同大小的数组,比如:

[[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]]
我想求两个数组的和,即

[49, 151, ...]

您可以使用以下内容:

a.flat_map{|x| x.in_groups_of(a.max_by(&:size).size, 0)}.transpose.map(&:sum)
或者这个:

a.max_by(&:size).map.with_index{|_, i| a.sum{|x| x[i]||0}}

不是很漂亮,但很管用:

>> a = [[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]]
=> [[45, 96, 0.0, 96, 96, 96, 0.0], [4, 55, 6, 55, 4, 4, 2, 55]]

>> sorted_a = a.sort_by(&:size).reverse
=> [[4, 55, 6, 55, 4, 4, 2, 55], [45, 96, 0.0, 96, 96, 96, 0.0]]

>> zipped_a = sorted_a.first.zip(sorted_a.last)
=> [[4, 45], [55, 96], [6, 0.0], [55, 96], [4, 96], [4, 96], [2, 0.0], [55, nil]]

>> zipped_a.map{ |arr| arr.map{ |v| v || 0 } }.map(&:sum)
=> [49, 151, 6.0, 151, 100, 100, 2.0, 55]

首先,您必须从最长的数组开始排序,以便
zip
正常工作。压缩将在较短数组的冗余值中创建
nil
值。因此,下一步是将这些
nil
s替换为零(使用嵌套的
map
),最后您可以
sum
值。

您也可以尝试这种方法

k =[]
for i in 0..ar.max_by(&:size).length-1 do
 k << ar.map { |x| [x[i]] }
end

k.map(&:flatten).map{|a| a.compact.sum}
=> [49, 151, 6.0, 151, 100, 100, 2.0, 55]
k=[]
对于0..ar.max_by(&:size)中的i.长度-1 do
k[49151,6.0151100100,2.0,55]
请注意,
nil.to#i=>0
()

另一个例子:

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

Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } }
  #=> [8,9,4]

OP不需要两个数组中所有值的总和,而是两个数组的“运行”总和。您尝试过吗?虽然它好得多,但它忽略了求和中的最后一个值(因为第一个数组较短)。这是可行的,尽管我个人对它的理解不如我的答案。我删除了否决票。我喜欢第二张!可以你已经试着自己解决这个问题了吗?如果是的话,你到底是在哪里被卡住的?一般来说,人们对“请为我编写此代码”请求(看起来像这样)的响应不太好,但对“我尝试了此方法,现在我卡住了/困惑了,请帮助”请求的响应很好;-)@吸烟者:是的,现在我意识到了这一点。我不知道为什么人们会投票反对一个问题?
a = [[1], [2,3,4], [5,6]]

Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } }
  #=> [8,9,4]