Scala for-loop。以简洁的方式获取索引

时间:2013-06-02 14:49:56

标签: scala loops yield

在此代码中,我想增加index以将其添加到每个yield结果中。

var index=0

for(str <- splitToStrings(text) ) yield  {

  if (index != 0) index += 1               // but index is equal to `0` all the time

  new Word(str, UNKNOWN_FORM, index )
}

为什么我无法更改index?那么实现这种逻辑的最佳方法是什么,试着简洁?

4 个答案:

答案 0 :(得分:22)

大多数类似序列的集合上的zipWithIndex方法将为您提供从零开始的索引,并随每个元素递增:

for ((str, index) <- splitToStrings(text).zipWithIndex)
  yield new Word(str, UNKNOWN_FORM, index)

答案 1 :(得分:6)

因为最初的index设置为0,所以你的条件index != 0永远不会执行为true,索引永远不会递增。 也许你不需要这个条件?也许你之后可以计算结果?现在我看到索引在循环中使用了。然后你必须使用@BenJames answer或递归。

答案 2 :(得分:3)

zipWithIndex将复制并创建一个新集合,因此当集合可能很大时,最好使其变得懒惰

for ((str, index) <- splitToStrings(text).view.zipWithIndex)
  yield new Word(str, UNKNOWN_FORM, index)

事实上,如果您正在使用索引序列,那么更有效的方法是使用indices,它会生成此序列的所有索引的范围。

val strs = splitToStrings(text)

for(i <- strs.indices) yield  {
  new Word(strs(i), UNKNOWN_FORM, i )
}

答案 3 :(得分:1)

splitToStrings(text).foldLeft(0,List[Word]){(a,b) => {
   if(a._1!=0) (a._1+1,new Word(str, UNKNOWN_FORM, index) :: b)
   else (a._1,new Word(str, UNKNOWN_FORM, index) :: b)
}}

我在这里使用foldLeft一个元组作为:index = 0的起始基数和空List。然后我遍历每个元素。

以上a是这个元组。我检查index值并递增它。否则我不添加index。我将新的Word添加到列表中。

最终你得到一个包含索引值的元组和包含所有单词的总List。