我正在尝试解决这个问题 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
}
}
最佳答案
立方体是 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])
还可以考虑使用列表而不是数组。那个 :+ 运算符每次都会分配一个新数组。如果您使用列表,它们会更智能,会更有效地执行这些不可变操作。
关于arrays - Scala BigInt 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19437297/