【问题标题】: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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-31
          • 1970-01-01
          • 2016-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-07
          • 1970-01-01
          相关资源
          最近更新 更多