首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于条件的数组/列表值求和

基于条件的数组/列表值求和
EN

Stack Overflow用户
提问于 2013-01-22 02:40:37
回答 4查看 371关注 0票数 1

给定一个数组X,Y的数组

代码语言:javascript
运行
复制
a=[[1,2],[2,2],[3,2],[4,2],[5,2],[6,2]]

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

EN

回答 4

Stack Overflow用户

发布于 2013-01-22 02:49:50

我会使用inject

代码语言:javascript
运行
复制
a = [[1,2],[2,2],[3,2],[4,2],[5,2],[6,2]]
sum = a.inject(0){ |sum, (x,y)| (x >= 2  and x < 4) ? sum + y : sum }
puts sum
#=> 4

rdoc很好地描述了inject方法:

注入(初始) {|备忘录,对象|块}→对象

通过应用由命名方法或运算符的块或符号指定的二元运算来组合枚举的所有元素。

如果指定一个块,那么对于枚举中的每个元素,都会向该块传递一个累加器值(memo)和该元素。如果改为指定符号,则集合中的每个元素都将传递给memo的命名方法。在这两种情况下,结果都将成为memo的新值。在迭代结束时,memo的最终值是该方法的返回值。

如果没有显式指定memo的初始值,则使用集合的第一个元素作为memo的初始值。

更新-基准数组与解包:

@tokland建议解开这些对,这肯定会提高可读性。运行了以下基准测试,看看它是否比使用数组(即我最初的解决方案)更快。

代码语言:javascript
运行
复制
require 'benchmark'

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

Benchmark.bm(12) do |b|
  b.report('array'){n.times{a.inject(0){ |sum, coord| (coord[0] >= 2  and coord[0] < 4) ? sum + coord[1] : sum }}}
  b.report('unpacked'){n.times{a.inject(0){ |sum, (x,y)| (x >= 2  and x < 4) ? sum + y : sum }}}
end

它给出了结果

代码语言:javascript
运行
复制
                   user     system      total        real
array          3.916000   0.000000   3.916000 (  3.925393)
unpacked       3.619000   0.000000   3.619000 (  3.616361)

因此,至少在这种情况下,解开对是更好的。

票数 3
EN

Stack Overflow用户

发布于 2013-01-22 02:59:45

我喜欢@JustinKo给出的注入答案,但如果你是Ruby新手,这里有另一个更容易理解的解决方案。

代码语言:javascript
运行
复制
a=[[1,2],[2,2],[3,2],[4,2],[5,2],[6,2]]
sum = 0
a.each { |x, y| sum += y if x >= 2 and x < 4 }
puts sum
#=> 4
票数 1
EN

Stack Overflow用户

发布于 2013-01-22 03:15:54

在ruby中,使用更简单的方法链更明显。所以:

代码语言:javascript
运行
复制
a=[[1,2],[2,2],[3,2],[4,2],[5,2],[6,2]]
a.select{ |i| (2...4).include? i[0] }.map(&:last).reduce(:+)
# => 4 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14445120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档