繁体   English   中英

如何在Scala中定义列表列表?

[英]How to define a list of lists in Scala?

我想为以下类型创建一个存储:

List(List(2.3,1.1),List(2.2, 1))

但如果我做以下事情:

var y = List(List (1.0, 2.2), List(2, 1.1, -2.1))

然后它创建List [AnyVal]并在我尝试执行数学运算时给出错误:

y(0)(0) * 2         // Error - value '2' is not a member of AnyVal

在两个示例中,一个列表包含一个作为Int的数字(第一个案例中的最后一个,第二个列表中的第一个元素),其余的数字是双打。 因此列表元素的推断类型将是AnyVal,这是它们的第一个常见超类型,因此您的外部列表将成为List [List [AnyVal]]。

如果你也尝试使用scala 2.8,那么它应该使用Numeric而不是AnyVal,因为它成为Double和Int的超类型。 大多数数值运算(在你的情况下乘法)也适用于它们。

要修复2.7.x的问题,只需使用双打来获取这些值(1.0或1D)。

明确地将类型声明为List [List [Double]]可能也会有所帮助。 在这种情况下,您给出的Int值将转换为Doubles。

您可能会发现此链接很有用: http//debasishg.blogspot.com/2009/01/higher-order-abstractions-in-scala-with.html

从上面的链接这里是一个列表列表的例子:

val brs: List[List[String]] =
  List(List("dave", "john", "sam"), List("peter", "robin", "david"), List("pras", "srim"))

那么,对于您的问题,您可能希望:

var y : List[List[Float]] = ...

这样您就可以删除类型推断的任何问题。

几言:

F:\prog\scala\scala-2.8.0.r18341-b20090718020201\bin>scala
Welcome to Scala version 2.8.0.r18341-b20090718020201 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var z = List(List (1.0, 2.2), List(2, 1.1, -2.1))
z: List[List[AnyVal]] = List(List(1.0, 2.2), List(2, 1.1, -2.1))

scala> var z = List(List (1.0f, 2.2f), List(2f, 1.1f, -2.1f))
z: List[List[Float]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1))

意思是,像问题“ Java:我的方法想要double类型而不是float? ”:

数字末尾的'f'使其成为浮点而不是双精度。
Java不会自动将double缩小为float。


scala> var z = (1.0f :: 2.2f :: Nil) :: (2f :: 1.1f :: -2.1f :: Nil) :: Nil
z: List[List[Float]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1))

也有效


仅添加显式类型是不够的:

scala> var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1))
<console>:4: error: type mismatch;
 found   : Double(1.0)
 required: Float
       var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1))
                                              ^
<console>:4: error: type mismatch;
 found   : Double(2.2)
 required: Float
       var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1))
                                                   ^
<console>:4: error: type mismatch;
 found   : Double(1.1)
 required: Float
       var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1))
                                                                 ^
<console>:4: error: type mismatch;
 found   : Double(-2.1)
 required: Float
       var z2 : List[List[Float]] = List(List(1.0, 2.2), List(2, 1.1, -2.1))
                                                                      ^

这与单个变量相同:

scala> var f : Float = -2.1
<console>:4: error: type mismatch;
 found   : Double(-2.1)
 required: Float
       var f : Float = -2.1
                       ^

scala> var f : Float = -2.1f
f: Float = -2.1

这似乎已在Scala 2.9中得到修复

Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var y = List(List (1.0, 2.2), List(2, 1.1, -2.1))
y: List[List[Double]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1))

scala> y(0)(0) * 2
res0: Double = 2.0
var y:List[List[Double]] = List(List (1.0, 2.2), List(2, 1.1, -2.1))

y(0)(0)*2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM