gpt4 book ai didi

ruby - 根据条件对 arraylist 值求和

转载 作者:太空宇宙 更新时间:2023-11-03 17:11:46 25 4
gpt4 key购买 nike

给定数组 [X,Y] 的数组:

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

2<=X<4 的所有 Y 数字求和的最有效方法是什么? ?

最佳答案

我会用这个:

a.select{ |x,y| (2...4) === x }.inject(0){ |m, (x,y)| m + y }
=> 4

不过,我真的不喜欢使用 ...,因为它的工作原理会让人们感到困惑。以下是一些等效的测试方法:

a.select{ |x,y| (2..3) === x }.inject(0){ |m, (x,y)| m + y }
ary.select{ |x,y| (2 <= x) && (x < 4) }.inject(0){ |m, (x,y)| m + y } } }

这是一些基准代码:

require 'benchmark'

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

Benchmark.bm(12) do |b|
b.report('The Tin Man') { n.times { a.select{ |x,y| (2...4) === x }.inject(0){ |m, (x,y)| m + y } } }
b.report('The Tin Man2') { n.times { a.select{ |x,y| (2 <= x) && (x < 4) }.inject(0){ |m, (x,y)| m + y } } }
b.report('Mik_Die') { n.times { a.select{ |i| (2...4).include? i[0] }.map(&:last).reduce(:+) } }
b.report('Justin Ko') { n.times { a.inject(0){ |sum, coord| (coord[0] >= 2 and coord[0] < 4) ? sum + coord[1] : sum } } }
b.report('Justin Ko2') { n.times { a.inject(0){ |sum, (x,y)| (x >= 2 and x < 4) ? sum + y : sum } } }
b.report('Leo Correa') { n.times { sum = 0; a.each { |x, y| sum += y if x >= 2 and x < 4 } } }
b.report('tokland') { n.times { a.map { |x, y| y if x >= 2 && x < 4 }.compact.inject(0, :+) } }
end

及其输出:

                   user     system      total        realThe Tin Man    4.020000   0.000000   4.020000 (  4.020154)The Tin Man2   2.420000   0.000000   2.420000 (  2.424424)Mik_Die        3.830000   0.000000   3.830000 (  3.836531)Justin Ko      2.070000   0.000000   2.070000 (  2.072446)Justin Ko2     2.000000   0.000000   2.000000 (  2.035079)Leo Correa     1.260000   0.000000   1.260000 (  1.259672)tokland        2.650000   0.010000   2.660000 (  2.645466)

这里吸取的教训是注入(inject)是昂贵的。

关于ruby - 根据条件对 arraylist 值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14445120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com