昨天,这段代码让我很头疼。我通过逐行读取文件来修复它。有任何想法吗 ?
即使文件中的行数大于 1,while 循环似乎也永远不会被执行。
val lines = Source.fromFile( new File("file.txt") ).getLines;
println( "total lines:"+lines.size );
var starti = 1;
while( starti < lines.size ){
val nexti = Math.min( starti + 10, lines.size );
println( "batch ("+starti+", "+nexti+") total:" + lines.size )
val linesSub = lines.slice(starti, nexti)
//do something with linesSub
starti = nexti
}
最佳答案
这确实很棘手,我什至会说这是Iterator
中的一个错误。 . getLines
返回 Iterator
懒惰地进行。所以似乎发生的是,如果你要求 lines.size
迭代器遍历整个文件以计算行数。之后,它“筋疲力尽”:
scala> val lines = io.Source.fromFile(new java.io.File("....txt")).getLines
lines: Iterator[String] = non-empty iterator
scala> lines.size
res4: Int = 15
scala> lines.size
res5: Int = 0
scala> lines.hasNext
res6: Boolean = false
你看,当你执行
size
时两次,结果为零。有两种解决方案,要么强制迭代器进入“稳定”状态,例如
lines.toSeq
.或者你忘记了 size
并进行“正常”迭代:while(lines.hasNext) {
val linesSub = lines.take(10)
println("batch:" + linesSub.size)
// do something with linesSub
}
关于这个while循环代码中的Scala古怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6770060/