3

我正在尝试解决这个问题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
    }
}
4

2 回答 2

3

立方体是 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])

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

于 2013-10-17T21:25:40.313 回答
0

Array[BigInt],但与 不同Array[Int]。实际上,BigIntand的常见超类型Intis Any,这就是为什么它出现在错误消息中的原因:当您 append 时cube,它是一个BigIntto master(perm),它是 and Array[Int],您将得到一个Array同时具有IntandBigInt的类型,并且是唯一支持两者的类型是Array[Any]

于 2013-10-17T21:21:51.983 回答