我正在尝试编写一个函数,将具有整数键的Map转换为相应的数组。我已经完成了基本情况,但正在尝试编写递归情况(即多维数组:将Map [Int,Map [Int,X]]转换为Array [Array [X]])。
这个任务是因为需要在不知道流中元素数量的情况下构建一个数组,允许元素以随机顺序从流中出现并且可能会出现重复元素。
我已经有一个可以实现此功能的函数:
注意,我知道如果映射包含键k但不包含0 <= i < k的键i,则代码将失败。对于我的目的来说,这没关系。
现在我想要对任意深度的多维数组做同样的事情。例如,将Map [Int,Map [Int,X]]转换为Array [Array [X]]。不幸的是,我被类型所困扰。以以上为基础情况,这是我目前的进展:
这是我收到的错误信息:
这个任务是因为需要在不知道流中元素数量的情况下构建一个数组,允许元素以随机顺序从流中出现并且可能会出现重复元素。
我已经有一个可以实现此功能的函数:
def toArrayHard[X:ClassManifest](x:scala.collection.Map[Int, X]):Array[X] =
{
if (x.size == 0) new Array(0)
else
{
val max:Int = 1 + x.keys.max
val a:Array[X] = new Array(max)
var i = 0
while (i < max)
{
a(i) = x(i)
i += 1
}
a
}
}
注意,我知道如果映射包含键k但不包含0 <= i < k的键i,则代码将失败。对于我的目的来说,这没关系。
现在我想要对任意深度的多维数组做同样的事情。例如,将Map [Int,Map [Int,X]]转换为Array [Array [X]]。不幸的是,我被类型所困扰。以以上为基础情况,这是我目前的进展:
def toArrayHardRec[X:ClassManifest](x:scala.collection.Map[Int, X]):Array[X] =
{
import scala.collection.Map
if (x.size == 0) new Array(0)
else
{
x match
{
case t:Map[Int, Map[Int, Y]] forSome { type Y } =>
{
val f0 = t.mapValues{m => toArrayHardRec[Map[Int, Y]](m)}
toArrayHard(f0)
}
case _ => toArrayHard(x)
}
}
}
这是我收到的错误信息:
由于这是一个教育性的追求,任何反馈都非常感谢。具体来说,我希望对我的类似Java的代码进行代码审查,寻找现有的Scala函数来完成相同的任务,或者提出构建这些数组的替代方法的建议。期望 '=>',但找到了 'forSome'。