gpt4 book ai didi

这个while循环代码中的Scala古怪

转载 作者:行者123 更新时间:2023-12-04 09:05:42 24 4
gpt4 key购买 nike

昨天,这段代码让我很头疼。我通过逐行读取文件来修复它。有任何想法吗 ?

即使文件中的行数大于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com