减少scala中的整数列表/整数范围

时间:2011-08-26 06:17:07

标签: scala scala-2.8 scala-collections

这里总有新手问题...今天在尝试计算整数列表的总和(实际上是BitSet)时,我遇到了溢出场景并注意到(sum / product)的返回类型是Int。 Range / List中是否有任何方法可以总结或说出将所有值乘以Long?

val x = 1 to Integer.MaxValue
println(x.sum) //prints -1453759936

感谢

4 个答案:

答案 0 :(得分:9)

在求和时将元素转换为Long(或BigInt应该走得那么远):

x.view.map(_.toLong).sum

你也可以回去弃牌

x.foldLeft(0L)(_ + _)

(注意:如果你在一个范围内求和,也许最好做一点数学,但我明白这不是你所做的事情)

答案 1 :(得分:2)

这不是很有效,但最简单的方法是:

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 :(得分: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 :(得分:1)

Range.Long(1, Int.MaxValue, 1).sum