【问题标题】:Fill immutable map with for loop upon creation创建时使用 for 循环填充不可变映射
【发布时间】:2015-08-14 05:07:18
【问题描述】:

我的地图是这样的:

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), ...

但我明白了

类型不匹配,预期:(NotInferedA, NotInferedB),实际:Unit

为什么会这样,我该如何克服?

【问题讨论】:

    标签: scala dictionary collections initialization immutability


    【解决方案1】:

    问题是你的 for 理解没有返回任何东西。 对于您的问题,这里有两种不同的解决方案。我个人更喜欢第二个。

    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
    }
    

    【讨论】:

    • 一个很好的答案。但我有一个问题......字段的构造函数是(Board,x:Int,y:Int),我想在Board类中创建字段(Map)。如果我做 Map((0 到 10)...) 我会遇到问题,因为“this”指的是地图,而我需要一个用于新字段的 Board。第一个版本有效。非常感谢!
    • 为什么this 会参考地图?看我的第二个例子。它似乎工作正常。
    • 是的,那是我的错误。现在我只需要弄清楚如何用 (a, b) 做到这一点,所以用两个循环/迭代
    • 我又加了一个例子。
    • 是的,谢谢,理解一下没问题。我认为您发布的“更好”的解决方案可能有两个循环,但我发现没有办法做到这一点,而且看起来仍然不错:)
    猜你喜欢
    • 2023-03-05
    • 2017-02-26
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2016-08-15
    相关资源
    最近更新 更多