Scala BigInt数组

时间:2013-10-17 21:07:05

标签: arrays list scala bigint invariants

我正在尝试解决此问题http://projecteuler.net/problem=62,我对此错误感到困惑:

euler.scala:10: error: type mismatch;
found   : Array[Any]
 required: Array[Int]
Note: Any >: Int, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Int`. (SLS 3.2.10)
    master(perm) = if (master.contains(perm)) master(perm) :+ cube else Array(cube)
                                                           ^
one error found

问题可能是因为BigInt试图存储在一个数组中,但显然没有像Array这样的数组[BigInt]

以下是我的代码:

import scala.util.control.Breaks._

var m = new scala.collection.mutable.LinkedHashMap[String,Array[Int]]
var master = m.withDefaultValue(Array.empty[Int])
val range = 345 to 9999

    range.foreach { n =>
    val cube = BigInt(n) * n * n
    val perm = cube.toString.map(_.asDigit).mkString("")
    master(perm) = if (master.contains(perm)) master(perm) :+ cube else Array(cube)
}

master.values.foreach { value =>
    if (value.length >= 5) {
        println (Math.cbrt(value(0)))
        break
    }
}

2 个答案:

答案 0 :(得分:3)

cube的类型为BigInt。所以Array(cube)的类型为Array [BigInt]

master(perm)的类型是Array [Int],你正在尝试

Array[Int] :+ BigInt => Array[Int], which does not work.

建议:制作BigInt类型的所有数组。

所以:

var m = new scala.collection.mutable.LinkedHashMap[String,Array[BigInt]]
var master = m.withDefaultValue(Array.empty[BigInt])

还要考虑使用List而不是数组。那:+运算符每次都会分配一个新数组。如果您使用列表,它们更智能,将更有效地执行这些不可变操作。

答案 1 :(得分:0)

Array[BigInt],但与Array[Int]不同。事实上,BigIntInt的常见超类型是Any,这就是为什么会出现在您的错误消息中:当您追加cube时,这是一个BigIntmaster(perm),即Array[Int],您Array同时拥有IntBigInt,支持两者的唯一类型是Array[Any]