在 for 循环中将元素添加到列表
Adding elements to a list in a for loop
var locations: List[Location] = List[Location]()
for (x <- 0 to 10; y <- 0 to 10) {
println("x: " + x + " y: " + y)
locations ::: List(Location(x, y))
println(locations)
}
上面的代码应该连接一些列表。但结果是一个空列表。为什么?
你的错误在线locations ::: List(Location(x, y))
。这是连接列表,但不对结果执行任何操作。如果将其替换为 locations = locations ::: List(Location(x, y))
,您将获得所需的结果。
然而,在 Scala 中有更多惯用的方法来解决这个问题。在 Scala 中,编写不可变代码是首选风格(即尽可能使用 val
而不是 var
)。
这里有几种方法:
使用产量:
val location = for (x <- 0 to 10; y <- 0 to 10) yield Location(x, y)
使用制表:
val location = List.tabulate(11, 11) { case (x, y) => Location(x, y) }
更短:
val location = List.tabulate(11, 11)(Location)
编辑:刚刚注意到您有 0 to 10
,这是包容性的。 0 until 10
是包含 - 排除。我已将 args 更改为制表为 11。
var locations: List[Location] = List[Location]()
for (x <- 0 to 10; y <- 0 to 10) {
println("x: " + x + " y: " + y)
locations ::: List(Location(x, y))
println(locations)
}
上面的代码应该连接一些列表。但结果是一个空列表。为什么?
你的错误在线locations ::: List(Location(x, y))
。这是连接列表,但不对结果执行任何操作。如果将其替换为 locations = locations ::: List(Location(x, y))
,您将获得所需的结果。
然而,在 Scala 中有更多惯用的方法来解决这个问题。在 Scala 中,编写不可变代码是首选风格(即尽可能使用 val
而不是 var
)。
这里有几种方法:
使用产量:
val location = for (x <- 0 to 10; y <- 0 to 10) yield Location(x, y)
使用制表:
val location = List.tabulate(11, 11) { case (x, y) => Location(x, y) }
更短:
val location = List.tabulate(11, 11)(Location)
编辑:刚刚注意到您有 0 to 10
,这是包容性的。 0 until 10
是包含 - 排除。我已将 args 更改为制表为 11。