Массив Scala BigInt

Я пытаюсь решить эту проблему 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
    }
}

person David Melin    schedule 17.10.2013    source источник
comment
BigInt и Int похожи в том же смысле, в котором Int похож на Thread. Вы не можете просто объединить массивы этих двух совершенно разных типов, у которых есть только Any в качестве общего предка, возможно, вам было бы лучше полностью переключиться на BigInt?   -  person om-nom-nom    schedule 18.10.2013


Ответы (2)


куб имеет тип BigInt. Итак, массив (куб) имеет тип Array[BigInt]

Тип master(perm) — Array[Int], и вы пытаетесь сделать

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

Предложение: сделайте все свои массивы типа BigInt.

So:

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

Также рассмотрите возможность использования списка вместо массива. Этот оператор :+ будет каждый раз выделять новый массив. Если вы используете списки, они умнее, будут выполнять эти неизменяемые операции более эффективно.

person triggerNZ    schedule 17.10.2013

Есть Array[BigInt], но он отличается от Array[Int]. Фактически, общим надтипом BigInt и Int является Any, вот почему это появляется в ваших сообщениях об ошибках: когда вы добавляете cube, который является BigInt, к master(perm), то есть и Array[Int], вы получите Array, который имеет оба Int. и BigInt, и единственный тип, который поддерживает оба, — это Array[Any].

person Daniel C. Sobral    schedule 17.10.2013