理解两个生成器
For comprehension with two generators
我想在 GUI 应用程序中的垂直列表中显示任意数量的字符串。
考虑以下示例:
val names = Seq[String]("Boris", "Anna", "Markus", "Simone")
for(a <- 1 to names.size + 1; name <- names) yield new ListItem(
name,
x = 20
y = 128 * a
size = 128
)
现在当然会创建一个 "cross-product" 并打印:
Boris Anna Markus Simone
Boris Anna Markus Simone
Boris Anna Markus Simone
Boris Anna Markus Simone
而想要的结果是
Boris
Anna
Markus
Simone
但是我还能如何将索引绑定到实际变量呢?我的意思是如果我做一个像这样的计数器:
for(a <- 0 to 1; b <- 0 to 1)
yield(a,b)
我会
Vector((0,0), (0,1), (1,0), (1,1))
但如果我愿意,我可以 (for a <- 0 to 1; b <- 0 to a) yield(a,b)
并获得
Vector((0,0), (1,0), (1,1))
我不知道如何用我的例子做到这一点。
你想要 zipWithIndex
,这将创建一个新的 Seq
,其中包含原始 Seq
中的每个元素,以及它在 Seq
.[=18 中的索引=]
scala> names.zipWithIndex
res2: Seq[(String, Int)] = List((Boris,0), (Anna,1), (Markus,2), (Simone,3))
然后您可以使用:
val names = Seq[String]("Boris", "Anna", "Markus", "Simone")
class ListItem(name: String, x: Int, y: Int, size: Int)
scala> for ((name, index) <- names.zipWithIndex)
yield new ListItem(name, 20, 128 * index, 128)
res0: Seq[ListItem] = List(ListItem@5956b37d, ListItem@4b22015d, ListItem@2587a734, ListItem@6cf25a2b)
也可以写成map
:
names.zipWithIndex.map { case (name, index) =>
new ListItem(name, 20, 128 * index, 128)
}
我想在 GUI 应用程序中的垂直列表中显示任意数量的字符串。
考虑以下示例:
val names = Seq[String]("Boris", "Anna", "Markus", "Simone")
for(a <- 1 to names.size + 1; name <- names) yield new ListItem(
name,
x = 20
y = 128 * a
size = 128
)
现在当然会创建一个 "cross-product" 并打印:
Boris Anna Markus Simone
Boris Anna Markus Simone
Boris Anna Markus Simone
Boris Anna Markus Simone
而想要的结果是
Boris
Anna
Markus
Simone
但是我还能如何将索引绑定到实际变量呢?我的意思是如果我做一个像这样的计数器:
for(a <- 0 to 1; b <- 0 to 1)
yield(a,b)
我会
Vector((0,0), (0,1), (1,0), (1,1))
但如果我愿意,我可以 (for a <- 0 to 1; b <- 0 to a) yield(a,b)
并获得
Vector((0,0), (1,0), (1,1))
我不知道如何用我的例子做到这一点。
你想要 zipWithIndex
,这将创建一个新的 Seq
,其中包含原始 Seq
中的每个元素,以及它在 Seq
.[=18 中的索引=]
scala> names.zipWithIndex
res2: Seq[(String, Int)] = List((Boris,0), (Anna,1), (Markus,2), (Simone,3))
然后您可以使用:
val names = Seq[String]("Boris", "Anna", "Markus", "Simone")
class ListItem(name: String, x: Int, y: Int, size: Int)
scala> for ((name, index) <- names.zipWithIndex)
yield new ListItem(name, 20, 128 * index, 128)
res0: Seq[ListItem] = List(ListItem@5956b37d, ListItem@4b22015d, ListItem@2587a734, ListItem@6cf25a2b)
也可以写成map
:
names.zipWithIndex.map { case (name, index) =>
new ListItem(name, 20, 128 * index, 128)
}