【问题标题】:reduce list of integers/range of integers in scala减少scala中的整数列表/整数范围
【发布时间】:2011-11-04 06:26:33
【问题描述】:
这里的新手问题...今天在尝试计算整数列表(实际上是 BitSet)的总和时,我遇到了溢出场景并注意到(总和/乘积)的返回类型是 Int。 Range/List 中是否有任何方法可以总结或说将所有值乘以 Long?
val x = 1 to Integer.MaxValue
println(x.sum) //prints -1453759936
谢谢
【问题讨论】:
标签:
scala
scala-2.8
scala-collections
【解决方案1】:
这不是很有效,但最简单的方法:
val x = 1L to Int.MaxValue
println(x.sum) //prints 2305843008139952128
如果你需要 x 包含 Ints 而不是 Longs,你可以这样做
val x = 1 to Int.MaxValue
println(x.foldLeft(0L)(_+_))
【解决方案2】:
比较:
>> val x = 1 to Int.MaxValue
x: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(...)
与:
>> val x = 1L to Int.MaxValue
x: scala.collection.immutable.NumericRange.Inclusive[Long] = NumericRange(...)
请注意,第一个使用Int.to,后者使用Long.to(其中 Int.MaxValue 自动向上转换)。当然,连续整数序列的和有一个非常好的离散公式:)
编码愉快。
【解决方案3】:
在求和时将元素转换为 Long(或者 BigInt 应该走那么远):
x.view.map(_.toLong).sum
你也可以回去折叠
x.foldLeft(0L)(_ + _)
(注意:如果你在一个范围内求和,也许做一点数学会更好,但我知道这不是你实际上所做的)
【解决方案4】:
Range.Long(1, Int.MaxValue, 1).sum