在此代码中,我想增加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
?那么实现这种逻辑的最佳方法是什么,试着简洁?
答案 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。