如何在Scala的for推导式中使用自增索引

7

在 Scala 的 for 推导式中是否可以使用自增计数器?

比如:

for (element <- elements; val counter = counter+1) yield NewElement(element, counter)
2个回答

16

我相信,你正在寻找在List和其他集合中可用的zipWithIndex方法。以下是它的使用示例:

scala> val list = List("a", "b", "c")
list: List[java.lang.String] = List(a, b, c)

scala> list.zipWithIndex
res0: List[(java.lang.String, Int)] = List((a,0), (b,1), (c,2))

scala> list.zipWithIndex.map{case (elem, idx) => elem + " with index " + idx}
res1: List[java.lang.String] = List(a with index 0, b with index 1, c with index 2)

scala> for ((elem, idx) <- list.zipWithIndex) yield elem + " with index " + idx
res2: List[java.lang.String] = List(a with index 0, b with index 1, c with index 2)

谢谢!现在我明白了那个方法的目的 :) - Matroska

2
一个for comprehension与for循环不同的是,每个先前项都会对术语进行评估。例如,查看下面的结果。我认为这不是您要寻找的内容:
    scala> val elements = List("a", "b", "c", "d")
elements: List[java.lang.String] = List(a, b, c, d)

scala> for (e <- elements; i <- 0 until elements.length) yield (e, i)
res2: List[(java.lang.String, Int)] = List((a,0), (a,1), (a,2), (a,3), (b,0), (b,1), (b,2), (b,3), (c,0), (c,1), (c,2), (c,3), (d,0), (d,1), (d,2), (d,3))

天使的答案可能更符合您期望的结果,但我希望这个反例对您有用。

是的,这就是我不明白它是否可行的原因。 - Matroska

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接