scala - 创建时用 for 循环填充不可变映射

标签 scala dictionary collections initialization immutability

我有一张看起来像这样的 map :

val fields: Map[(Int, Int), Field]

我想过做这样的事情:

val fields: Map[(Int, Int), Field] = 
Map(
   for(a <- 0 to 10)
   {
     (0, a) -> new Field(this, 0, a)
   }
)

而不是像这样的长复制/粘贴列表:

  (0, 0) -> new Field(this, 0, 0),
  (1, 0) -> new Field(this, 1, 0),
  (2, 0) -> new Field(this, 2, 0),
  (3, 0) -> new Field(this, 3, 0),
  (4, 0) -> new Field(this, 4, 0),
  (5, 0) -> new Field(this, 5, 0),
  (6, 0) -> new Field(this, 6, 0),
  (7, 0) -> new Field(this, 7, 0),
  (8, 0) -> new Field(this, 8, 0),

  (0, 1) -> new Field(this, 0, 1), ...

但我明白了

Type mismatch, expected: (NotInferedA, NotInferedB), actual: Unit

这是为什么?我该如何克服这个问题?

最佳答案

问题是您的理解不会返回任何内容。 这里有两种不同的解决方案来解决您的问题。我个人更喜欢第二个。

case class Field(map: Map[(Int, Int), Field], a: Int, b: Int)

val fields: Map[(Int, Int), Field] = 
Map(
   (for(a <- 0 to 10) yield (0, a) -> new Field(fields, 0, a)): _*
)

val fields: Map[(Int, Int), Field] =
  (0 to 10).map(a => (0, a) -> new Field(fields, 0, a)).toMap

编辑:

case class Field(board: Board, x: Int, y: Int)
class Board {
  val fields: Map[(Int, Int), Field] =
    (0 to 10).map(a => (0, a) -> new Field(this, 0, a)).toMap
}

 

class Board {
  val fields: Map[(Int, Int), Field] =
    (for(a <- 0 to 10; b <- 0 to 10)
        yield (a, b) -> new Field(this, a, b)).toMap
}

关于scala - 创建时用 for 循环填充不可变映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30561653/

相关文章:

scala - 为什么Scala不能绑定(bind)通配符类型参数?

scala - 使用Spark访问数据框中的列

scala - 缩小、折叠或扫描(左/右)?

python - Pandas 使用数据框作为字典或查找

c# - 为什么 ConcurrentDictionary.TryRemove 需要第二个参数?

java - 何时在Java中通过ArrayList使用LinkedList?

list - Scala 中的异构列表;使用 map 功能

arrays - 从字典中获取值作为 Swift 2 中的数组

java - 返回一组映射中的所有键

java - java中如何决定使用哪个通配符?