9

在这段代码中,我想递增index以将其放入每个yielding 结果。

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

4 回答 4

25

大多数类似序列的集合上的zipWithIndex方法会给你一个从零开始的索引,随着每个元素递增:

for ((str, index) <- splitToStrings(text).zipWithIndex)
  yield new Word(str, UNKNOWN_FORM, index)
于 2013-06-02T14:59:51.150 回答
6

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

于 2013-06-02T14:51:50.593 回答
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 )
}
于 2013-06-03T01:08:02.353 回答
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到列表中。

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

于 2013-06-02T15:01:55.760 回答